【问题标题】:IE operating faster with function calls?IE 使用函数调用运行得更快?
【发布时间】:2012-12-19 14:49:23
【问题描述】:

寻找优化我的代码的方法,我偶然发现了this jsPerf test。除了重申我对函数调用缓慢的概念之外,别无所求,我在 IE 9 上的结果真的让我陷入了一个循环。利用函数调用的代码更快,但仅限于这一浏览器。我多次运行它,结果相同。我看不到测试设置不正确。是什么导致了这个奇怪的结果?

我的用户代理是Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0,在 Windows Server 2008 上运行。

【问题讨论】:

  • 奇怪,IE 10 也不这样做。
  • 刚刚确认它只是一个 IE 9 的东西。在另一台计算机上再次尝试。
  • 制表符进程是 32 位还是 64 位?脚本调试是启用还是禁用?如果您曾经使用过测试的 result 会有什么不同(例如,防止优化整个事情)
  • 似乎 IE9 出现了异常,所以在所有情况下都很奇怪,逻辑内联应该更快或等于函数调用,列表越来越长,一旦我进行了测试,Safari 就会出现一个问题。不在图表中包含我的测试。

标签: internet-explorer-9 function-calls performance


【解决方案1】:

免责声明:我是jsPerf.com的创建者。


您的第一个测试如下:

var i = 0;
for (i = 0; i < 1000; i++) {
  test()
}

为什么要在其中包含for 循环?它只会扭曲结果。 jsPerf 会自动重复测试代码,直到它执行了足够的测试以达到统计上显着的结果。理想情况下,jsPerf 测试尽可能紧凑,并且只测试您真正想要测试的内容。在这种情况下,您对for 循环性能根本不感兴趣——您只想知道内联代码是否比调用函数更快。

如果您对创建强大的 jsPerf 测试用例的其他技巧感兴趣,check out my #jsconfeu2011 presentation。

注意:我并不是说多余的 for 循环是您看到此结果的原因。这可能是一个因素,但可能还有其他因素会进一步扭曲结果。 This might be IE9’s “dead code removal” feature kicking in.

无论如何,我已经分叉了你的 jsPerf 测试,删除了循环,并使变量成为全局变量,以避免死代码消除优化。 http://jsperf.com/function-calls-vs-inline/3 你能在 IE9 中测试一下吗?目前我手头没有 IE9 虚拟机。

【讨论】:

  • 我现在无法使用 IE9 访问我的机器,但也许更奇怪的是,Chrome 现在通过函数调用也能更快地运行。
  • @TreyKeown:有趣的是,我可以在 Chrome 28 中重现结果,但不能在 Chrome 30 Canary 中重现。这可能是 Chrome 28 附带的 v8 版本中的一个侥幸。不久前发生了类似的事情 — 在某些时候,执行范围查找比在 v8 中执行范围查找不更快:@ 987654325@
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
相关资源
最近更新 更多