例如:我有一个由while循环组成的函数(此函数将检查素数)
function isprime(int number){
int i=2;
int max= (int) sqrt(number)+1;
while(i<max){
if(number%i==0){
return 0;
}
i++;
}
return 1;
}
我知道这是测试质数的非常差的算法,但是无论如何,我的问题更多地集中在循环上。当前,函数的第四项操作仅“检查”条件。对于较大的数字,这可能会很多。
(快速示例1:如果“ number”为1009,则将检查while条件30次,对索引执行30次操作,对于if条件进行29 * 2次操作。即118个操作。)
我意识到,我可以在while条件内剪切并粘贴并让索引通过最大值,同时导致其他操作,而不会伪造返回值。因此,如果我剪切从“ if ...”到“ i ++”的所有内容,并将其粘贴三(或n)次,检查while条件只会占用1/10(或1 /(1 + 3n)个操作),而最多创建+ 2 * 3(或+(n-1)个)* 3)不必要的操作。
(快速示例2:如果“ number”为1009,则意味着将检查while条件11次,对索引执行33个操作,对于if条件进行33 * 2个操作。即100个操作,少13个操作。)
由于我目前正在试验非常大的数字(用外行的话:“条件将在非常,非常,非常长的时间内出错”),因此将if条件和增量粘贴数千次将是有用的,但非常不切实际-所以我的问题是:
是否有工具(或我缺少的技术)为我做到这一点,但使代码清晰易修改?
提前致谢!
您的问题还不清楚。
首先,您可以稍微更改算法;例如,增加2,而不是增加1(因为高于2的每个素数都是奇数)。
然后,在被要求进行优化(例如使用g++ -Wall -O2
)时,编译器通常会进行一些循环展开,就好像编译器“复制”(并恒定折叠)了循环主体几次一样。
使用GCC时,您可以通过使用__builtin_expect来帮助优化器,例如
#ifdef __GNUC__
#define MY_UNLIKELY(P) __builtin_expect((P),0)
#else
#define MY_UNLIKELY(P) (P)
#endif
然后您将进行编码
if(MY_UNLIKELY(number%i==0))
return 0;
最后,您应该进行基准测试,手动优化代码可能并不值得。(在CPU缓存今天是非常重要的,所以展开过多可能会拖慢代码,也看到__builtin_prefetch
在海湾合作委员会和本)。
您还可以考虑元编程和多阶段编程功能。在诸如Meta Ocaml或Common Lisp之类的语言中,元编程的意义远不止C ++ 11 template
。您可以考虑在运行时生成C代码(然后将dlopen
其生成),或使用类似JIT的编译库libjit
(例如进行部分评估)。另请参阅J.Pitrat的有关元组合搜索的博客以及eval上的wikipage 。我的MELT 系统显示,这些技术可以(痛苦地)与C ++结合使用(MELT在运行时生成C ++代码,因此可以通过这种方式进行元编程)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句