#c #оптимизация
Оригинальный copypaste. Функция копирования по указателю.
register short *to, *from;
register count;
{
register n=(count+7)/8;
switch(count%8){
case 0: do{ *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
}while(--n>0);
}
}
Выгода очевидна. Петля распараллеливается, следовательно уменьшается количество сравнений
с условием цикла и благодаря switch без break первый проход можно начать из любой точки,
что позволяет без проблем копировать количество байт не кратное количеству строк внутри
петли, при этом оставив ее параллельной.
Кто-нибудь замерял насколько код выше работает быстрее обычной петли снизу?
do {
*to = *from++;
} while(--count > 0);
Ответы
Ответ 1
Во-первых "быстро" и "вывод в порт" - это не совместимые понятия. На вывод в порт потратится сколько тактов, что разница от разворачивания цикла будет не заметна. Во-вторых, если рассматривать копирование вообще, то быстрее будет копировать не 8 раз по байту, а 1 раз по uint64_t, или самый широкий тип, который пролазит в шину памяти. И наконец, при использовании устройства Даффа, каждая итерация цикла будет начинаться на не выровненных данных, что может несколько уменьшить производительность копирования.
Комментариев нет:
Отправить комментарий