Я знаю, что это было довольно давно, но вот реализация подпроцедуры из heapsort, в которой использование регистровых переменных делает алгоритм быстрее, по крайней мере, используя gcc 4.5.2 для компиляции кода
inline void max_heapify(int *H, int i){
char OK = FALSE;
register int l, r, max, hI;
while(!OK){
OK = TRUE;
l = left(i);
r = right(i);
max = i;
if(l <= H[SIZE] && H[l] > H[i]){
max = l;
}
if(r <= H[SIZE] && H[r] > H[max]){
max = r;
}
if(max != i){
OK = FALSE;
hI = H[i];
H[i] = H[max];
H[max] = hI;
i = max;
}
}
}
Я протестировал алгоритм с ключевым словом register и без него перед атрибутами и выполнил его для сортировки случайного массива из 50 000 000 элементов в моем ноутбуке, несколько раз для каждой версии.
использование регистров сократило время пирамидальной сортировки с ~ 135 с до ~ 125 с.
Я также тестировал только 5 000 000 элементов, но выполнял его больше раз.
Версия без регистра начиналась с 11 с, но каждое выполнение уменьшало время, пока не достигло 9,65 с, и останавливалось на нем.
версия с регистром стартовала с 10с и снизила время до 8,80с.
Я думаю, что это как-то связано с кэш-памятью. Тем не менее кажется, что регистры ускоряют алгоритм в постоянном множителе.
Поскольку эти переменные довольно часто используются в алгоритме, обеспечение их регистрации вместо того, чтобы возлагать эту работу на компилятор, привело к лучшему результату в этом случае. Однако это не сильно улучшило время.
Надеюсь кому-то будет полезно, приветствую.
person
Community
schedule
15.06.2013