#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, или самый широкий тип, который пролазит в шину памяти. И наконец, при использовании устройства Даффа, каждая итерация цикла будет начинаться на не выровненных данных, что может несколько уменьшить производительность копирования.
Комментариев нет:
Отправить комментарий