减少分支预测提高程序性能

2014年10月4日 由 Creater 留言 »
z_int32 nearZ = 0;  
for( z_int32 j = 0; j < sw; j++, alpha -= z_pi_f )  
{  
    if( alpha < NEARZERO && alpha > -NEARZERO ) nearZ = j;  
    else if( j & 1 ) sum -= horz[j] / alpha;  
    else sum += horz[j] / alpha;  
}  

此代码有几个条件,一个是位于0附近的特殊处理,另外是循环变量的奇偶判断。
耗时:1312.68457 ms

将if拆成更多的for,减少for循环的分支预测:

z_float32 alpha2 = alpha1 - z_pi_f;  
z_int32 j;  
for( j = 0; alpha1 > z_pi_f; j+=2, alpha1 -= z_2pi_f) sum += horz[j] / alpha1;  
if( alpha1 > -NEARZERO && alpha1 < NEARZERO ){ nearZ = j; j += 2; alpha1 -= z_2pi_f; }  
for( ; j < sw; j+=2, alpha1 -= z_2pi_f ) sum += horz[j] / alpha1;  
  
for( j = 1; alpha2 > z_pi_f; j+=2, alpha2 -= z_2pi_f) sum -= horz[j] / alpha2;  
if( alpha2 > -NEARZERO && alpha2 < NEARZERO ){ nearZ = j; j += 2; alpha2 -= z_2pi_f; }  
for( ; j < sw; j+=2, alpha2 -= z_2pi_f ) sum -= horz[j] / alpha2;  

先拆奇偶,然后拆0附近的循环,这样下来的效果是
耗时:918.65375 ms

广告位

发表评论

你必须 登陆 方可发表评论.