for(UINT i = 0; i<size; i++)
{
tmp = pix;
avr = (*pix+++*pix+++*pix++)/3;
*pix_out++ = clipvalue_8(avr+(*tmp++-avr)*lvl);
*pix_out++ = clipvalue_8(avr+(*tmp++-avr)*lvl);
*pix_out++ = clipvalue_8(avr+(*tmp++-avr)*lvl);
[COLOR="Red"]// Вариант исправлен внизу топика[/COLOR]
}
Оптимизационные забавы...
Код:
Код:
for(UINT i = 0; i<size; i++)
{
R = *pix++, G = *pix++, B = *pix++;
avr = (R+G+B)/3;
*pix_out++ = clipvalue_8(avr+(R-avr)*lvl);
*pix_out++ = clipvalue_8(avr+(G-avr)*lvl);
*pix_out++ = clipvalue_8(avr+(B-avr)*lvl);
}
{
R = *pix++, G = *pix++, B = *pix++;
avr = (R+G+B)/3;
*pix_out++ = clipvalue_8(avr+(R-avr)*lvl);
*pix_out++ = clipvalue_8(avr+(G-avr)*lvl);
*pix_out++ = clipvalue_8(avr+(B-avr)*lvl);
}
Соответственно:
Код:
BYTE *pix, *pix_out, *tmp, R, G, B;
WORD avr;
WORD avr;
Время выполнения десяти циклов первой реализации для некоторого изображения: 0.46 сек
Второй: 0.76 сек
Чем объясняется такой выигрыш в скорости первого варианта?
Видно, что во втором варианте на два оператора присваивания больше, но и на три инкримента меньше.
Грубо говоря. Первый код проще оптимизировать. Там все возможные переменные можно поместить в доступные регистры общего назначения. Во втором случае переменных гораздо больше.
Кстати первый код некоректный. )
Код:
Кстати первый код некоректный. )
Так колись :)
Некорректно изменять значение *pix более одного раза в данном выражении, насколько я помню. )
А вот в более сложных выражениях это может стать проблемой.
Если речь об этом...
Поправте меня, если я ошибаюсь.
Спасибо.
Возражений нет :)
А жаль.... ;(
Код:
for(UINT i = 0; i<size; i++)
{
avr = (*pix+*(pix+1)+*(pix+2))/3;
*pix_out++ = clipvalue_8(avr+(*pix++-avr)*lvl);
*pix_out++ = clipvalue_8(avr+(*pix++-avr)*lvl);
*pix_out++ = clipvalue_8(avr+(*pix++-avr)*lvl);
}
{
avr = (*pix+*(pix+1)+*(pix+2))/3;
*pix_out++ = clipvalue_8(avr+(*pix++-avr)*lvl);
*pix_out++ = clipvalue_8(avr+(*pix++-avr)*lvl);
*pix_out++ = clipvalue_8(avr+(*pix++-avr)*lvl);
}
В скорости не уступает.