是否有工具/解决方案可以对循环进行编程,其中仅每 X 次迭代检查一次条件?

2023-12-04

例如:我有一个由 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 的素数都是奇数)。

然后,当被要求optimize(例如与g++ -Wall -O2),编译器通常会做一些循环展开,就好像它多次“复制”(并不断折叠)循环体一样。

With 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 in GCC and this).

你也可以考虑元编程 and 多阶段编程设施;在像这样的语言中元奥卡姆 or 通用语言元编程手段多得多比 C++11template事物。你可以考虑生成C代码在运行时(然后dlopening it),或者使用 JIT 编译库,例如libjit(例如,做部分评价)。另请阅读 J.Pitrat 的博客元组合搜索,以及维基页面eval. My MELT系统表明这些技术可以(痛苦地)与 C++ 相关使用(MELT 在运行时生成 C++ 代码,因此可以通过这种方式进行元编程)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否有工具/解决方案可以对循环进行编程,其中仅每 X 次迭代检查一次条件? 的相关文章

  • 通过指向基址的指针删除对象而不使用虚拟析构函数

    我有代码 class A1 public A1 cout lt lt A1 virtual A1 cout lt lt A1 class A2 public A2 cout lt lt A2 A2 cout lt lt A2 class B
  • 当假设 [[assume]] 包含 UB 时会发生什么?

    在 C 23 中 assume expression 属性使得如果表达 is false 行为未定义 例如 int div int x int y assume y 1 return x y 这会编译成相同的代码 就像y一直是1 div i
  • 计算序列而无法存储值?

    问题陈述 here http www spoj com problems EC SER 令 S 为无限整数序列 S0 a S1 b Si Si 2 Si 1 对于所有 i gt 2 你有两个整数 a 和 b 您必须回答有关序列中第 n 个元
  • 如何使用 LINQ 对列表的列表进行分组(例如:List>)

    我知道我可以使用一些 for 循环轻松地做到这一点 但想看看是否有一种方法可以使用流畅的 LINQ 来做到这一点 我试图找出每个子列表中有多少个 我在看Enumerable SequenceEqual http msdn microsoft
  • 为什么在此单元测试中,BackgroundWorker 没有在正确的线程上调用 RunWorkerCompleted?

    backgroundWorker 的全部目的是在执行耗时的任务后更新 UI 组件正如广告所宣传的那样在我的 WPF 应用程序中 但是在我的测试中 回调不会在调用线程上调用 Test public void TestCallbackIsInv
  • 表达式:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 错误

    此错误发生在运行时 我不确定是什么原因导致的 代码对我来说看起来是正确的 include
  • MPI_Gather 分段错误

    我有这个并行高斯消除代码 调用以下任一方法时会发生分段错误MPI Gather函数调用 我知道如果没有为任一缓冲区正确分配内存 可能会出现此类错误 但我看不出内存管理代码有什么问题 有人可以帮忙吗 Thanks Notes 该程序从一个 t
  • 调度算法,找到设定长度的所有非重叠区间

    我需要为我的管理应用程序实现一种算法 该算法将告诉我何时可以将任务分配给哪个用户 我实现了一个蛮力解决方案 它似乎有效 但我想知道是否有更有效的方法来做到这一点 为了简单起见 我重写了算法以对数字列表进行操作 而不是数据库查询等 下面我将尝
  • Web API 2 中的方法名称约定 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否有 Web API 2 中使用的约定的列表 以这两种方法为例 两者都可以工作 但都没有用属性来装饰 IHttpActionResu
  • 使用 C# 从文本中删除数字

    我有一个要处理的文本文件 其中有一些数字 我只想要其中的文字 而不是其他任何东西 我成功删除了标点符号 但是如何删除数字呢 我想要使 用 C 代码 另外 我想删除长度大于 10 的单词 如何使用 Reg 表达式来做到这一点 您可以使用正则表
  • 将 boost::iostreams::mapped_file_source 与 std::multimap 一起使用

    我有相当大量的数据需要分析 每个文件大约有 5gig 每个文件的格式如下 xxxxx yyyyy 键和值都可以重复 但键是按升序排列的 我正在尝试使用内存映射文件来实现此目的 然后找到所需的键并使用它们 这是我写的 if data file
  • 找到两个值的平均值的正确方法是什么?

    我最近了解到整数溢出是 C 中的未定义行为 附带问题 C 中也是 UB 吗 在 C 编程中 您通常需要求两个值的平均值a and b 然而做 a b 2可能会导致溢出和未定义的行为 所以我的问题是 找到两个值的平均值的正确方法是什么a an
  • 以编程方式打开网页并以字符串形式检索其 html 包含内容

    我有一个 Facebook 帐户 我想提取我朋友的照片及其个人详细信息 例如 出生日期 就读学校 等 我能够提取我每个朋友帐户的 Facebook 首页的地址 但我不知道如何以编程方式打开我每个朋友首页的网页并将 html 包含保存为字符串
  • 将 LPTSTR 转换为要写入文件的字符串或 char *

    我想将 LPTSTR 转换为字符串或 char 以便能够使用 ofstream 将其写入文件 有任何想法吗 Use T2A http msdn microsoft com en us library 87zae4a3 VS 80 aspx宏
  • 我们还需要迭代器设计模式吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • MonoMac 窗口关闭时没有错误

    我刚刚开始在 Xamarin Studio 中使用 MonoMac 并且遇到了最奇怪的问题 我有一个带有 NSButton 和 NSTextField 的窗口 至此 我已经删除了按钮上的事件处理程序 因此它不会执行任何操作 除了在单击它时突
  • Linq 表达式树 Any() 问题

    您好 我在使用 Any 扩展方法的表达式树时遇到问题 这是我的代码 IQueryable
  • 并排显示图像的一半 - OpenGL

    我为两个图像创建了两个纹理 现在我想在opengl中按图像2的左侧部分 完整的图像1 图像2的右侧部分的顺序显示该纹理 我已经做了如下 Image1 显示在 opengl 屏幕的中央 但屏幕的左右部分不正确 应分别显示 image2 的左侧
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • 同时使用多个控制台

    是否有捷径可寻 我现在仅使用控制台测试我的网络应用程序 最好的办法是从一个项目中拥有多个控制台 然后按一下 立即调试 菜单项 我可以像过去一样使用多个项目 但这似乎很笨拙 理想情况下 我可以启动多个控制台实例 从同一线程运行很好 并且让它们

随机推荐

  • JQuery - 延迟对象数组的 $.when 语法[重复]

    这个问题在这里已经有答案了 这是我第一次使用 when我在语法上遇到困难 我的代码类似于下面的简化示例 它有效 如果我在简化时没有引起错误 我的问题是我不知道家里的很多元素customerIds数组将包含 var customerIds n
  • 错误1053:服务没有及时响应启动或控制请求

    我最近继承了几个作为 Windows 服务运行的应用程序 并且在为它们提供 GUI 可从系统托盘中的上下文菜单访问 时遇到问题 我们需要 Windows 服务的 GUI 的原因是为了能够重新配置 Windows 服务的行为 而无需停止 重新
  • MySQL 获取行,但更喜欢一个列值而不是另一列值

    有点奇怪 我想编写一个 MySQL 查询来从表中获取结果 但更喜欢列的一个值而不是另一个值 即 id name value prioirty 1 name1 value1 NULL 2 name1 value1 1 3 name2 valu
  • 在Google Guava(Java)中,如何批量设置ArrayTable的值?

    我有一个二维数据数组 例如 V 我想批量设置数组表实例 我必须反复打电话吗ArrayTable put R rowKey C columnKey V value 我找不到合适的构造函数 静态创建助手或方法 例如 putAll V value
  • 如何指示应首先编辑变量

    我有以下实时模板 import NAME from PATH END 当它插入编辑器时 输入变量的顺序定义为 import 1 from 2 有什么办法可以改成 import 2 from 1 只需使用编辑变量编辑该实时模板时按钮 然后使用
  • 在 2.2 上获取 ListView 项目的视图/逆序;适用于 4.0.3

    我有一个 ListView 它显示 ArrayAdapter 中的项目 我想在点击视图时为其设置动画 问题是在不同版本的 android 上我得到不同的视图 见下文 我使用此方法从 ListActivity 获取视图 private Vie
  • Java:如何使用UrlConnection发送授权请求?

    我想向需要身份验证的服务器生成 POST 请求 我尝试使用以下方法 private synchronized String CreateNewProductPOST String urlString String encodedString
  • 如何将 KB2670838 包含在 InstallShield 2013 的安装程序中?

    我正在使用 InstallShield 2013 为需要的应用程序制作基本 MSI 安装程序Windows 平台更新 KB2670838 对于 NET 框架和其他要求 我在 Redistributables 部分的 InstallShiel
  • 使用包含竖线的正则表达式匹配字符串

    I have 123 456 789 我只能捕捉 123 使用正则表达式 d 但不确定如何捕获完整的字符串 我对此很陌生 我将感谢任何帮助 d 这应该有效 从竖线开始 重复数字和可选的竖线
  • Graphviz---随机节点顺序和经过标签的边

    我有以下点文件 digraph finite state machine rank same node shape doublecircle q 5 node shape circle q 1 gt q 2 label q 1 gt q 2
  • 无法使用pip安装python包,需要获取Microsoft Visual C++ 14.0

    我正在尝试安装pyjks 我正在管理命令提示符下运行所有 内容 最初尝试安装 pyjks 的结果是 C WINDOWS system32 gt pip install pyjks Collecting pyjks Collecting py
  • 带标题的 PHP Mail() 函数

    当我将 header 与 PHP mail 函数一起使用时 我总是很困难 问题总是一样的 去年 这次 只要我记得 就让我抓狂 问题在于标题仅显示在电子邮件中 收到的邮件示例 Source onderwerp Bedankt voor uw
  • 防止 jQuery Mobile 上的水平滚动

    有没有办法最好仅使用 CSS 来防止移动设备上的水平页面滚动 这是一个例子 http jsfiddle net YfLst 15 Update 以下代码解决了 iOS 上的问题 但 Android 上的问题仍然存在 html body ov
  • 如何在 Eclipse 中以调试模式运行外部工具

    由于各种原因 我的项目只能作为已完成且打包的 JAR 运行 组装时会发生一些神奇的事情 因此我将其作为 Eclipse 中的外部工具运行 我缺少的是调试功能 有没有办法在 Eclipse 中以调试模式运行外部工具 如果远程 JVM 已在调试
  • 记录完成谷歌表单所需的时间

    我正在尝试记录完成并提交 Google 表单所需的总时间 我的逻辑很简单 以下代码将记录时间戳并将其作为多项选择选项 然后 在提交表单后 我们无论如何都会得到一个时间戳 但与此同时 我们也会得到最初记录的时间戳作为该问题的答案 这是我可爱的
  • JSONEncoder 的 dateEncodingStrategy 不起作用

    我正在尝试使用 Swift 4 的 Encodable JSONEncoder 将结构序列化为字符串 该对象可以保存异构值 例如 String Array Date Int 等 除了日期之外 所使用的方法工作正常 JSON编码器的dateE
  • 如何派生具有类型族的记录的实例

    这是我正在尝试但无法编译的内容 LANGUAGE TypeFamilies LANGUAGE StandaloneDeriving LANGUAGE FlexibleInstances import Data Text as T impor
  • URL缩短网站

    我正在开发一个使用 PHP MySQL 和 Apache 的 URL 缩短网站 当我查看开源项目时 URL 缩短的总体思路是 用户提供 URL 链接 系统从数据库获取该链接的 ID 然后转换 ID X 基数系统 我使用的是 36 基数 然后
  • 删除连续的重复单元格

    只是为了澄清 我不想删除重复的行 我想删除行中的重复单元格 这是一个经典的地址表 在某些行中有重复的条目 我需要删除这些条目 我在 VBA 中看到的大部分内容都是用于删除列中的重复值 但我找不到删除行中的重复值的方法 Name Addres
  • 是否有工具/解决方案可以对循环进行编程,其中仅每 X 次迭代检查一次条件?

    例如 我有一个由 while 循环组成的函数 这个函数会检查素数 function isprime int number int i 2 int max int sqrt number 1 while i