为什么浏览器阵列操作之间的性能差异如此之大?

时间:2018-09-11 08:36:11

标签: node.js performance firefox microsoft-edge v8

我正在调整库goodcore并设置了一些性能测试,以与本机数组函数进行比较。然后,我在笔记本电脑上针对Edge,FF,Chrome和Node 10.9运行它们。当然,我的lib的结果参差不齐,但是更有趣的是,浏览器之间的差异有时在最佳与最差之间是30倍,并且在两次操作之间似乎并没有完全改变。

使用的数组长10000,随机整数在0到100000之间。

编辑版本:

  • Chrome:68.0.3440.106
  • FF:62.0
  • 边缘:41.16299.371.0
  • 节点:10.9

这是我的结果(仅用于本机操作):

编辑:现在具有正确的值和自定义算法(无本机)

Graph1 Graph2

数据显示Benchmark.js中的ops / sec。

enter image description here

这是由于数据结构实现还是微优化?

1 个答案:

答案 0 :(得分:2)

  

这是由于数据结构实现还是微优化?

是的

更长的答案:可能两者都有,但是肯定要回答这个问题的唯一方法是详细查看每个浏览器的实现。

您所测量的较大差异看起来可能是由于底层数据结构的根本不同所致;但是,即使使用相同的基本数据结构,其余实现的效率也会产生巨大差异(我见过10倍-100倍)。

此外,恕我直言,您的结果有些可疑:Chrome和Node使用相同的V8引擎,并且应该具有非常相似的性能。诸如“ indexOf”或“ splice(remove 1)”之类的结果,在相同结果之间应该有约10倍的差异,这表明基准测试可能有问题。而且,如果这两个结果不可信,那么为什么您对Edge / Firefox的结果更有信心?

说到基准质量:仅使用一种类型的数组(仅一种大小,仅一种类型的内容,始终密集)是您的结果可能无法反映完整情况的另一个原因;因此请谨慎从中得出任何结论。

  

为什么会有如此大的性能差异

因为快速Array内置方法是一项大量的工程工作。每个浏览器的工程团队都在尽力将自己的时间花在他们认为最重要的功能上。结果是,您会在各种实现中看到不同程度的优化。

如果在后台选择的数据结构存在差异(我不知道),那么通常就需要权衡取舍:一种选择在X处可能更快,而在Y处则比另一种选择慢。或者可能更快,但会占用更多内存;等