【转】程序细节时间开销
源自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的目的,只是为了让那个数非负,那用 加上一个很大的数 时间更快。。