尽可能避免使用 mod 运算符是否更好?

2024-02-10

我认为计算数字的模是一个有点昂贵的操作,至少与简单的算术测试(例如查看数字是否超过数组的长度)相比。如果确实如此,那么替换例如以下代码是否会更有效:

res = array[(i + 1) % len];

与以下? :

res = array[(i + 1 == len) ? 0 : i + 1];

第一个对眼睛来说更容易,但我想知道第二个是否会更有效。如果是这样,当使用编译语言时,我是否可以期望优化编译器将第一个片段替换为第二个片段?

当然,这种“优化”(如果它确实是一种优化)并不在所有情况下都有效(在这种情况下,它仅在以下情况下有效)i+1永远不会超过len).


我的一般建议如下。使用您认为更直观的版本,然后分析整个系统。仅优化探查器标记为瓶颈的代码部分。我敢打赌,模运算符不会出现在其中。

就具体示例而言,只有基准测试才能判断使用特定编译器在特定架构上哪个更快。您可能会将模替换为分枝 http://software.intel.com/en-us/articles/avoiding-the-cost-of-branch-misprediction,而且这并不明显,哪个会更快。

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

尽可能避免使用 mod 运算符是否更好? 的相关文章

随机推荐

  • jqGrid 和动态分组

    我正在对 jqGrid 进行一些动态分组 按照以下位置发布的示例 http www trirand com blog jqgrid jqgrid html http www trirand com blog jqgrid jqgrid ht
  • 服务器是否可以同时收到两个请求? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我对服务器如何处理数千个请求有点困惑 我想如果有数千个请求 最终其中两个请求必须同时到达服务器 如果两条消息同时到达它 它只能处理一条 对
  • PHP:使用 preg_match 获取 url 变量?

    http www example com id 05 or http www example com id 05 name johnny 这是一个字符串 我想得到的值 id从中 它的正确模式是什么 您不需要正则表达式 除非您有充分的理由 否
  • 防止 HttpClient 4 遵循重定向

    我正在使用 Apache HttpComponents 库连接到我的 AppEngine 应用程序 为了对我的用户进行身份验证 我需要将身份验证令牌传递到应用程序的登录地址 http myapp appspot com ah login a
  • 下载大文件 - iPhone SDK

    我正在使用 Erica Sadun 的异步下载方法 项目文件的链接位于此处 download http uhelios com downloaderica zip 但是她的方法不适用于大尺寸 50 mb 或以上 的文件 如果我尝试下载超过
  • 如何访问组件中 FormArray 中定义的 HTML 中的控件 - Angular2

    我在用ReactiveFroms在我的应用程序中 当我添加static控制然后一切都工作正常 我正在展示validation使用错误inbuilt类的controls 在职的Plunkr https plnkr co edit AZ5Jgw
  • 如何注册私有 DICOM 标签?

    我想知道公司 例如飞利浦或西门子 如何注册私有 DICOM 标签 I mean 如何保证DICOM组不被其他厂家占用 假设飞利浦选择了标签 1111 00xx 那么它需要知道组 1111 尚未被占用 之后NEMA还需要参与吗 或者有其他组织
  • 无法在 android 中添加 addView

    我需要朋友们的帮助 这是我的活动 public class MainActivity extends Activity float values 700 400 100 500 600 float values1 70 40 10 50 O
  • System.IO.Packaging:无法确定域的身份

    我正在使用 System IO Packaging 在完全托管的桌面 Windows 窗体 应用程序中创建文件 在一定条件下 OPC包的写入会引发 无法确定域的身份 例外 我了解到它与独立存储有关 因为打包 API 有时会在那里创建临时数据
  • 如何使用引导行和列增加文本区域的高度

    我设计了一个表单 其中连续有两个项目 如下所示 我的输出 Code我用过的 div class row div class col sm 3 fieldset class form group fieldset div div
  • 计算unix日志文件中两个时间段之间的行数[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Log file
  • 如何创建一个从 goroutine 接收多个返回值的通道

    我在 Go 中有一个返回两个值的函数 我想将其作为 goroutine 运行 但我无法弄清楚创建接收两个值的通道的语法 有人能指出我正确的方向吗 定义一个包含两个值字段的自定义类型 然后创建一个chan那种类型的 编辑 我还添加了一个使用多
  • 未捕获的类型错误:FB.login 不是函数

    我正在使用 Facebook JavaScript API 创建 Facebook 登录功能并从 API 获取用户详细信息 当我以正常方式使用相同的代码时 我从 Facebook api 获取数据 当我尝试使用 requireJS 做同样的
  • 如何获取当前日期之前的 30 天?

    我有一个开始日历输入框和一个结束日历输入框 我们希望默认开始日历输入框为当前日期之前 30 天 结束日历输入框默认为当前日期 这是我的日期变量 var today new Date dd today getDate mm today get
  • 从资源中读取json文件并在JAVA中将其转换为json字符串

    我在代码中硬编码了这个 JSON 字符串 String json n id 1 n name Headphones n price 1250 0 n tags home green n n 我想将其移至资源文件夹并从那里读取它 我怎样才能在
  • 在 Cocoa 中创建 iTunes 风格源列表时遇到问题

    我正在开发一款可以与 iTunes 风格的源列表配合良好的软件 我一直在网上寻找如何实现它 但所有的例子似乎都有点粗略 我找到了马克 奥尔德里特的执行 http www latenightsw com blog p 29并尝试在我的项目中使
  • CouchDB - 创建或更新文档时触发代码

    我有一个在 CouchDB 中存储数据的页面 该页面直接通过 JavaScript 访问数据库 因此浏览器中没有隐藏太多逻辑 创建新文档时 有一些逻辑将数据元素提取到单独的字段中 以便可以搜索它们 创建或更新文档时是否可以在服务器上执行此逻
  • 如何使用 [object addGesture...] 从 C4Workspace 调用方法?

    我希望实现的是使用以下方法调用 C4Workspace m 中的方法 shape addGesture SWIPELEFT name swipeLeft action leftSwipeMethod 我知道这会尝试在 C4Shape 类中调
  • jQuery livequery 插件相当于 jQuery 1.7+

    是否有相当于 jQuery 1 7 的 jQuery livequery 插件 我正在尝试动态绑定事件 读取 DOM 元素应基于 data 元素绑定的事件 a href class js test Test 1 a a href class
  • 尽可能避免使用 mod 运算符是否更好?

    我认为计算数字的模是一个有点昂贵的操作 至少与简单的算术测试 例如查看数字是否超过数组的长度 相比 如果确实如此 那么替换例如以下代码是否会更有效 res array i 1 len 与以下 res array i 1 len 0 i 1