优化的确定效果

时间:2016-10-07 20:17:55

标签: javascript optimization

免责声明:这个问题使用jQuery作为示例,但不是关于jQuery。

有没有办法确定编译器如何优化某段代码?

例如,假设someCollection.size()是不变的,则此代码为:

for (var i = 0; i < someCollection.size(); i++) ...

在最近的编译器中,应该优化到更像这样的东西:

var _unnamed = someCollection.size();
for (var i = 0; i < _unnamed; i++) ...

因此,自己编写此代码不会给您带来任何价值(并且可能性较差)。

最近,我想看看使用箭头功能会如何影响性能。从理论上讲,它们可能比等效的正常函数更快,因为它们具有更少的开销(它们不会绑定许多东西)。我用它作为测试用例:

$('.someClass').each( (undefined, value) => { doSomething($(value)); } );

使用“普通”功能的等价物:

$('.someClass').each( function() { doSomething($(this)); } );

每个方法都运行了几千次,首先是箭头功能,然后是正常功能,我惊讶地发现箭头功能一直略慢。公平地说,然后我先运行正常函数,结果反转,正常函数更慢。首先运行哪个函数似乎并不重要 - 它总是会变慢。一旦我开始任意运行该函数的一个方法并丢弃这些结果,其余的结果变得非常相似。

我的假设是第一次测试中有一些优化正在影响后续测试的结果。

我的问题是:如何找出优化器正在做什么,以便确定任何特定优化是否确实有效?

1 个答案:

答案 0 :(得分:2)

  

例如,假设someCollection.size()是不变的,则此代码为:

当前的JS引擎无法确定someCollection.size()是不变的,因此无法执行此优化。并且这种方法极不可能被内联(这将允许提到的优化)。

你正在调用一个函数,这个函数几乎可以做任何事情,所以这里没有确定性。

  

我的问题是:如何找出优化器正在做什么,以便确定任何特定优化是否确实有效?

目前,我们在该领域拥有3/4主要JS引擎:

  • Chrome中的V8&amp;戏
  • Chakra in Edge
  • FF中的SpiderMonkey
  • 而且我不完全确定Apple使用的是什么,无论是迁移到V8还是仍然使用Nitro。
    无论如何,根据我的经验,Safari的性能与Chrome不同。

您可以预期这些基本上都使用相同的优化技术,但由于您可能会遇到性能差异,因此您也可以得出结论,他们会以不同的方式应用它们。

我的结论:你正在追逐幽灵/过早优化

即使你展示了一个独特的函数,也不可能确定任何这些JIT编译器所应用的最终优化,因为它还依赖于从该函数的特定调用和传递的值中收集的数据。因此,只需通过不同的使用方式,可以在网站的不同呼叫上以不同方式优化一个功能。

看看这个:Vyacheslav Egorov - LXJS 2013 - Performance and benchmarking

不是这个问题的答案,但也许是一些见解,为什么这整个问题(因为它)是浪费时间。