ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 ноября
164511 Топик полностью
ReAl (24.08.2009 19:34 - 19:42, просмотров: 111) ответил fk0 на Говнокод (помогите оптимизировать size & speed)
Ну если уж гоутушить, то хоть так:  if (ulaw&0x40) { xexp = 7 << 4; goto l1; } else if (ulaw&0x20) { xexp = 6 << 4; goto l2; } else if (ulaw&0x10) { xexp = 5 << 4; goto l3; } else if (ulaw&0x08) { xexp = 4 << 4; goto l4; } else if (ulaw&0x04) { xexp = 3 << 4; goto l5; } else if (ulaw&0x02) { xexp = 2 << 4; goto l6; } else if (ulaw&0x01) { xexp = 1 << 4; goto l7; } else { xexp = 0; goto l8; } l1: samp>>=1; l2: samp>>=1; l3: samp>>=1; l4: samp>>=1; l5: samp>>=1; l6: samp>>=1; l7: samp>>=1; l8: Нет расходов времени на цепочечные goto когда уже ясно, что остались одни сдвиги А уже это очевидно заменяется на if (ulaw&0x40) { xexp = 7 << 4; } else if (ulaw&0x20) { xexp = 6 << 4; } else if (ulaw&0x10) { xexp = 5 << 4; } else if (ulaw&0x08) { xexp = 4 << 4; } else if (ulaw&0x04) { xexp = 3 << 4; } else if (ulaw&0x02) { xexp = 2 << 4; } else if (ulaw&0x01) { xexp = 1 << 4; } else { xexp = 0; } switch(xexp) { case 7 << 4: samp>>=1; case 6 << 4: samp>>=1; case 5 << 4: samp>>=1; case 4 << 4: samp>>=1; case 3 << 4: samp>>=1; case 2 << 4: samp>>=1; case 1 << 4: samp>>=1; default: }Что, впрочем, может оказаться несколько дольше. А вот тут if (ulaw&0x40) { xexp = 7; } else if (ulaw&0x20) { xexp = 6; } else if (ulaw&0x10) { xexp = 5; } else if (ulaw&0x08) { xexp = 4; } else if (ulaw&0x04) { xexp = 3; } else if (ulaw&0x02) { xexp = 2; } else if (ulaw&0x01) { xexp = 1; } else { xexp = 0; } switch(xexp) { case 7: samp>>=1; case 6: samp>>=1; case 5: samp>>=1; case 4: samp>>=1; case 3: samp>>=1; case 2: samp>>=1; case 1: samp>>=1; default: } xexp <<= 4; или тут (ещё более грубый намёк компилятору) if (ulaw&0x40) { xexp = 0; } else if (ulaw&0x20) { xexp = 1; } else if (ulaw&0x10) { xexp = 2; } else if (ulaw&0x08) { xexp = 3; } else if (ulaw&0x04) { xexp = 4; } else if (ulaw&0x02) { xexp = 5; } else if (ulaw&0x01) { xexp = 6; } else { xexp = 7; } switch(xexp) { case 0: samp>>=1; case 1: samp>>=1; case 2: samp>>=1; case 3: samp>>=1; case 4: samp>>=1; case 5: samp>>=1; case 6: samp>>=1; default: } xexp = (7 - xexp) << 4; компилятор может догадаться использовать вычисляемый goto. И в "безгоутушных" вариантах в принципе может догадаться скомпилировать то же самое, что в первом, так как значение xexp "предсказуемо" и лишние проверки не нужны. Но это должен быть хороший компилятор. Иначе вариант с явными goto будет быстрее.