【转】程序细节时间开销

源自Shinecheng~

 今天有一题一直TLE,本来以为是取模运算超时,结果最后证明是求绝对值超时。
简单记录今天的测试结果(循环10^8次。每个循环中有100个相同操作):

#define abs(a) ((a)>0?(a):(-(a))
操作:lala = abs(i);
时间:7800ms

操作: if(i > 0) lala = i; else lala = -i;
时间:8000ms

操作 lala = i + 1000000000;
时间:3350ms

#define MOD ((1<<20)-1)
操作 lala = i % MOD;
时间:44300ms

操作 lala = i & MOD;
时间: 3351ms


#define MOD ((1<<20))
操作 lala = i % MOD;
时间:7975ms

操作 lala = i & (MOD-1);
时间: 3350ms

当MOD是形如1<<20这样的数时,%运算会比其他情况快很多(编译器优化吧)。
但是,如果采用技巧 &(MOD-1)的话,更快!(只对正数有效的样子。。。)

当我们用abs的目的,只是为了让那个数非负,那用 加上一个很大的数 时间更快。。

posted @ 2013-11-01 18:18  _sunshine  阅读(233)  评论(1编辑  收藏  举报