是否有工具/解决方案来编程仅在每个X迭代中检查一次条件的循环?

格雷格·泰纳

例如:我有一个由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 OcamlCommon Lisp之类的语言中,元编程的意义不止C ++ 11 template您可以考虑在运行时生成C代码(然后将dlopen其生成),或使用类似JIT的编译库libjit(例如进行部分评估)。另请参阅J.Pitrat的有关元组合搜索的博客以及eval上的wikipage 我的MELT 系统显示,这些技术可以(痛苦地)与C ++结合使用(MELT在运行时生成C ++代码,因此可以通过这种方式进行元编程)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否有工具/解决方案来编程仅在每个X迭代中检查一次条件的循环?

来自分类Dev

我可以让 Visual Studio 只在解决方案中构建每个项目一次吗?

来自分类Dev

仅在条件中循环一次

来自分类Dev

对几个项目或解决方案运行msbuild生成后任务,并在每个生成中运行一次

来自分类Dev

是否有一种干净的方法可以仅在第一次迭代时或在执行之前检查循环中的变量?

来自分类Dev

是否有for循环或purrr解决方案?

来自分类Dev

R中是否有任何解决方案可将TRUE / FALSE分配给第一次出现(观察当前期间而不是之前的那个)

来自分类Dev

检查while循环是否在C#中的第一次迭代中

来自分类Dev

Silverstripe检查是否在循环的第一次迭代中

来自分类Dev

在delphi中是否有唯一的解决方案是GOTO?

来自分类Dev

检查字符是否在字符串中至少出现了N次。算法有什么解决方案吗?

来自分类Dev

fefo在while循环的最后一次迭代中没有检查EOF吗?

来自分类Dev

一次构建多个解决方案平台?

来自分类Dev

是否有任何简单的“一键式”解决方案来清除 KDE 中的打印队列?

来自分类Dev

如何分配一个循环来为每个核心运行一次迭代

来自分类Dev

是否有一个优雅的解决方案可以在迭代时修改结构?

来自分类Dev

如何在循环中更改条件,但仅在第一次迭代之后?

来自分类Dev

laravel在foreach循环中使用if条件时检查foreach循环的最后一次迭代

来自分类Dev

是否有任何正常的解决方案来编辑Aerospike列表中的地图

来自分类Dev

是否有解决方案来重新组织JavaScript中的以下数组?

来自分类Dev

有没有人有更好的解决方案来“迭代地”在Python中应用zip?

来自分类Dev

For循环仅在python中经历一次迭代

来自分类Dev

for循环仅在第一次迭代时执行

来自分类Dev

Python:检查列表中是否有任何子字符串的优雅解决方案?

来自分类Dev

每个范围一次初始化循环迭代器是否更好?

来自分类Dev

检查是否在解决方案中调用了函数

来自分类Dev

是什么导致我的循环仅在第一次迭代中忽略此“ \ t”?

来自分类Dev

仅在xsl:for-each循环的第一次迭代中添加xsl:param

来自分类Dev

如何一次在一个解决方案中编写多个项目中的代码?[Visual Studio/Xamarin]

Related 相关文章

  1. 1

    是否有工具/解决方案来编程仅在每个X迭代中检查一次条件的循环?

  2. 2

    我可以让 Visual Studio 只在解决方案中构建每个项目一次吗?

  3. 3

    仅在条件中循环一次

  4. 4

    对几个项目或解决方案运行msbuild生成后任务,并在每个生成中运行一次

  5. 5

    是否有一种干净的方法可以仅在第一次迭代时或在执行之前检查循环中的变量?

  6. 6

    是否有for循环或purrr解决方案?

  7. 7

    R中是否有任何解决方案可将TRUE / FALSE分配给第一次出现(观察当前期间而不是之前的那个)

  8. 8

    检查while循环是否在C#中的第一次迭代中

  9. 9

    Silverstripe检查是否在循环的第一次迭代中

  10. 10

    在delphi中是否有唯一的解决方案是GOTO?

  11. 11

    检查字符是否在字符串中至少出现了N次。算法有什么解决方案吗?

  12. 12

    fefo在while循环的最后一次迭代中没有检查EOF吗?

  13. 13

    一次构建多个解决方案平台?

  14. 14

    是否有任何简单的“一键式”解决方案来清除 KDE 中的打印队列?

  15. 15

    如何分配一个循环来为每个核心运行一次迭代

  16. 16

    是否有一个优雅的解决方案可以在迭代时修改结构?

  17. 17

    如何在循环中更改条件,但仅在第一次迭代之后?

  18. 18

    laravel在foreach循环中使用if条件时检查foreach循环的最后一次迭代

  19. 19

    是否有任何正常的解决方案来编辑Aerospike列表中的地图

  20. 20

    是否有解决方案来重新组织JavaScript中的以下数组?

  21. 21

    有没有人有更好的解决方案来“迭代地”在Python中应用zip?

  22. 22

    For循环仅在python中经历一次迭代

  23. 23

    for循环仅在第一次迭代时执行

  24. 24

    Python:检查列表中是否有任何子字符串的优雅解决方案?

  25. 25

    每个范围一次初始化循环迭代器是否更好?

  26. 26

    检查是否在解决方案中调用了函数

  27. 27

    是什么导致我的循环仅在第一次迭代中忽略此“ \ t”?

  28. 28

    仅在xsl:for-each循环的第一次迭代中添加xsl:param

  29. 29

    如何一次在一个解决方案中编写多个项目中的代码?[Visual Studio/Xamarin]

热门标签

归档