如何避免“优化掉”我的 javascript 测试用例?

2024-02-08

我有一个jsperf测试用例 http://jsperf.com/multiplication-vs-division-lars,结果非常令人困惑。我有三个“片段”:

  • 乘法
  • division
  • 控制(都不进行任何操作)

大多数时候,它们的速度都相同......甚至是控制!我猜测 JS JIT 编译器是删除我的“不必要的”指示 https://blog.mozilla.org/javascript/2014/07/15/ionmonkey-optimizing-away/当它们似乎没有任何效果时;所以我开始累积结果并将其记录到控制台 https://stackoverflow.com/a/4871762/423105当测试循环完成时,例如

for (var i = 0; i < nNumbers; i++) {
  result += a[i] / b[i];
}
console.log(result);

但是,当控制台打开时和不打开时,我得到了截然不同的结果。控制台日志记录的减慢似乎压倒了任何其他性能问题。

因此,我尝试增加每个“片段”中的迭代次数,以最大程度地减少与我尝试测试的操作相关的日志记录量。但我仍然发现这三个片段之间没有显着的速度差异。真的,除法和乘法与计算常数的速度大致相同?我一定做错了什么。或者 jsperf 坏了。

已经回答了一些相关问题,但我没有发现专门针对 Javascript 基准测试的问题。

  • 如何防止 Rust 基准库优化我的代码? https://stackoverflow.com/questions/32385805/how-can-i-prevent-the-rust-benchmark-library-from-optimizing-away-my-code
  • 我如何确定编译器不会优化我的性能测试? https://stackoverflow.com/questions/4871550/how-can-i-be-sure-that-the-compiler-doesnt-optimize-away-my-performance-test

不要放console.logs 在你的定时部分。与您实际想要测量的操作相比,它的速度非常慢,因此它会扭曲您的结果。另外 - 正如您所注意到的 - 当控制台打开或不打开时,它的时间会有所不同。

您可以通过将结果放入全局数组来防止去优化。优化器只能删除代码 https://en.wikipedia.org/wiki/Dead_code_elimination这不会影响结果,如果它操纵全局状态,这是不可能的。

当然,这仍然不一定能阻止循环不变代码运动 https://en.wikipedia.org/wiki/Loop-invariant_code_motion,因此您还需要确保您的定时代码始终对不同的数据进行操作。

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

如何避免“优化掉”我的 javascript 测试用例? 的相关文章

  • 即使 if 语句中发生警报,​​if 语句中的 jQuery 代码也不会运行

    我有一个 if 语句 里面有两个警报以及一个变量赋值 当满足条件时 所有这三件事都会发生 但是当我将 jQuery 代码添加到 if 语句套件中时 该 jQuery 代码不会发生 我怎样才能得到 tabViewWindow animate
  • Node 和 General 中的 MVC:模型如何与视图绑定?

    我从 node js 开始 正在制作一个简单的 MVC 框架 到目前为止 我已经有一个前端控制器 或 调度程序 如果你愿意的话 可以工作 路由通过调度程序配置模块进行 如图所示 我的问题在最后 紧接代码之后 另外 这是学习node的练习 请
  • 为什么 foo.hasOwnProperty('__proto__') 等于 false?

    var foo bar 5 Why is foo hasOwnProperty proto 等于false 它不能来自原型链中更高层的任何对象 因为它是特定于这个对象的 EDIT 有些答案说它已开启Object prototype 但我不明
  • Android 上的 Chrome 强制隐藏地址栏

    我最近开发了一个获取混合 http https 内容的网站 因此 我总是将地址栏显示在顶部 它不会像其他网站那样自动隐藏 这就是我要说的 This https planetkde org 是网站的链接 内容是从各种来源获取的 因此无法过滤非
  • 定时器内嵌套异步等待 - 不返回所需的值

    我必须使用 Mocha 和 chai 测试来测试端点的响应 下面是相同的代码 async function getData userId let response let interval setInterval async gt resp
  • Javascript:打乱数组中的对象组

    我有一个对象数组 我已按键排序 group如下 使得所有具有相同值的对象group在索引中彼此相邻data 例如 var data foo cat group house foo cat group house foo cat group
  • 为什么有人将(Apache mod_expires 参数)ExpiresByType 设置为“访问加 0 秒”?

    在审查答案时这个帖子 https stackoverflow com questions 9933012 how to use mod headers and mod expires to cache 我不明白为什么这里使用 0 秒作为最佳
  • 检测 iPad Safari 用户的最佳方法

    添加用于检测 iPad Safari 用户的代码的最佳方法是什么 我的意思是我们应该使用 1 CSS 通过链接媒体 2 JS 通过navigator对象 我听说使用用户代理字符串并不是检测 iPad 的最佳方法 因为存在不一致的情况 请建议
  • 如何像在浏览器中一样检索准确的 HTML

    我正在使用 Python 脚本来呈现网页并检索其 HTML 它适用于大多数页面 但对于其中一些页面 检索到的 HTML 不完整 我不太明白为什么 这是我用来废弃此页面的脚本 由于某种原因 每个产品的链接不在 HTML 中 Link http
  • 将 DIV 转换为单击并拖动视口

    有人知道一种不显眼的 基于原型或无框架的方法将具有大内容 例如地图 的 DIV 转换为具有固定尺寸的可点击和可拖动的 地图 容器 非常像 Google 地图 我想在大型输入表单中显示 HTML 块 这些块可能会超出可用空间 每个块可以有大约
  • 如何在javascript中删除一组表情符号中的最后一个表情符号?

    假设我的字符串中有 3 个表情符号 字符串中没有任何空格或除表情符号之外的任何其他字符 如何删除javascript中最后一个表情符号 下面的答案不使用任何特殊的包并安全地删除最后一个表情符号 function safeEmojiBacks
  • 无法安装js-bson

    我正在使用Windows 7 64位 尝试安装bson作为mongodb的依赖项 我收到此错误 npm WARN package json email protected cdn cgi l email protection No READ
  • 如何使表格单元格的最小宽度为 3 位数字?

    如何使表格中的每个单元格的最小宽度为 3 位数字且不会更大 现在我正在硬编码min width 但我不喜欢硬编码一个值 因为我将来可能想更改字体 如果需要Javascript也没关系 table border 1 tr td 1 td td
  • 将罗马数字转换为阿拉伯数字--recursiv

    我是 JavaScript 新手 正在网站的帮助下学习https www jshero net koans roman1 html https www jshero net koans roman1 html 本练习是编写一个转换器 将罗马
  • TinyMCE:将 CSS 类属性与 formatselect-dropdown 格式结合使用

    我想定制格式 http wiki moxiecode com index php TinyMCE Configuration theme advanced blockformats在 TinyMCE 中格式选择下拉菜单 http wiki
  • 如何在javascript中设置从数据库输入的最大数量?

    我希望根据数据库中的数量设置 输入类型 数字 中输入的最大数量 目前 我正在尝试让它在数据最大的基础上工作 然后再尝试从数据库中获取最大值 但它似乎无法工作 之前已经在这里问过 但我仍然无法理解 在 php javascript 中设置数据
  • 如何缩放到高图中的特定点

    Highmaps highcharts 是一个 javascript jquery 适配器 可在浏览器等中呈现地图 我有一张突出显示单个国家 地区的地图 但是 世界 地图的比例如此之大 因此我想在将地图加载到相关国家 地区后进行放大 看看
  • 为什么 [].push([]) 返回 1? [复制]

    这个问题在这里已经有答案了 为什么这会返回 1 push outputs 1 push 返回数组的新长度 one push two returns 2 array length is 2 one two push something ret
  • 在javascript中我们如何识别一个对象是Hash还是Array?

    我的 JSON 调用的输出可以是数组或哈希 我如何区分这两者 现代浏览器支持Array isArray obj method See MDN https developer mozilla org en US docs Web JavaSc
  • IE 中带有“删除”方法的 jQuery.ajax 问题

    我有一个页面 用户可以使用按钮编辑各种内容并选择触发 ajax 调用 特别是 一个操作会导致远程调用一个 url 其中包含一些数据和 放置 请求 这 因为我使用的是宁静的 Rails 后端 会触发我的更新操作 我还有一个删除按钮 它调用相同

随机推荐