amosk: (Pheebs shocked)
До оптимизации:
do {                          
    *to = *from++;            
} while (--count > 0);
После оптимизации:
 int 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 {} и do {}. Я и не догадывался, что стандарт C позволяет внутри switch писать структуры с вложенностью и помещать метки case  перед любыми их операторами на любом уровне вложенности, а не только непосредственно под switch.

Правда сам я написал бы подобный код только за очень большие деньги. Такие, чтобы я мог до конца жизни больше не писать программы :).

Ыкс: http://en.wikipedia.org/wiki/Duffs_device

Profile

amosk: (Default)
amosk

December 2016

S M T W T F S
    123
45678910
11121314151617
18192021222324
252627 28293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 27th, 2025 04:53 pm
Powered by Dreamwidth Studios