amosk: (Pheebs shocked)
amosk ([personal profile] amosk) wrote2009-03-28 08:43 am
Entry tags:

Чудеса извращений (программистское)

До оптимизации:
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

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting