Я знаю, что это довольно долгое время, но вот реализация подпроцедуры из 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;
}
}
}
Я тестировал algortihm с и ш без ключевого слова register перед атрибутами и выполнить его для сортировки случайного массива с 50 000 000 элементов на моем ноутбуке, несколько раз для каждой версии.
Использование регистров уменьшило время от времени от 135 до 125 секунд.
Я также тестировал только 5 000 000 элементов, но выполнял его больше раз.
версия без регистра началась в 11s, но каждое исполнение понизило время, пока он не достиг 9,65s и остановился на ней
версии с реестром начался в 10-ых и снизило время до 8,80s.
Я думаю, что это имеет какое-то отношение к кэш-памяти. Тем не менее, кажется, что регистры быстрее выполняют алгоритм с помощью константного фактора
Поскольку эти переменные довольно часто используются по алгоритму, гарантируя, что они находятся в регистре, а не оставляют эту работу компилятору, привели к лучшему результату в этом дело. Однако это не улучшило время.
Надеюсь, что это поможет кому-то, привет.
«Три вещи могут случиться, а два плохие»? Где я это слышал раньше ... ;-) – 2008-11-25 03:13:38
Помните, что компилятор совершенно свободен игнорировать ваше предложение - в стандарте нет ничего, чтобы сказать, что он должен поместить регистрационную переменную в регистр. – 2008-12-13 22:09:00
также может быть так, что вы пишете компилятор, и вы говорите, что «регистр» для всех локалей в функции сделает функцию без стека. это было бы очень полезно, я думаю. – 2008-12-13 22:51:53