哪个 JS 基准站点是正确的?

Which JS benchmark site is correct?

我在 jsperf.com 和 jsben.ch 上创建了一个基准,但是,它们给出了截然不同的结果。

JSPerf:https://jsperf.com/join-vs-template-venryx
JSBench:http://jsben.ch/9DaxR

请注意,代码块完全相同。

在 jsperf 上,块 1 比最快的“慢 61%”:

在 jsbench 上,块 1 只比最快的块慢 32%:((99 - 75) / 75)

什么给了?我希望基准站点给出相同的结果,至少在百分之几内。

就目前而言,由于不一致,我无法就哪个选项最快做出结论。

编辑

扩展的基准列表:

不确定哪个最好,但我会跳过 jsben.ch(最后一个),原因是 Job 提到:它不显示运行次数、误差范围或数量每秒操作数——这对于估计绝对性能影响以及实现基准站点 and/or 浏览器和浏览器版本之间的稳定比较很重要。

(目前我最喜欢http://jsbench.me。)

2019 年 3 月更新: results are inconsistent between Firefox and Chrome - perf.zone 在 Chrome 上表现异常,jsben.ch 在 Firefox 上表现异常。在我们确切地知道 为什么 之前,你能做的最好的事情就是在多个网站上进行基准测试(但我仍然会跳过 jsben.ch,其他网站至少会给你一些误差范围和统计数据关于跑了多少次,等等)

TL;DR: 运行 你在 perf.zone and on jsbench.github.io (see here and here 上的代码),结果与 jsperf 非常匹配。 个人和其他人原因不仅仅是这些结果,我比 jsben.ch.

更信任这三个网站

最近,我也尝试对字符串连接的性能进行基准测试,但在我的例子中,它是从 1000000 多个单个字符串中构建一个字符串(join('') 赢了这么大的数字,顺便说一句)。在我的机器上 jsben.ch 超时而不是给出结果 。也许它对你的效果更好,但对我来说这是一个很大的警告信号:

http://jsben.ch/mYaJk

http://jsbench.github.io/#26d1f3705b3340ace36cbad7b24055fb

https://run.perf.zone/view/join-vs-concat-when-dealing-with-very-long-lists-of-single-character-strings-1512490506658

(我懒得再处理 jsperf 的 not all tests inserted,抱歉)

目前我怀疑但不能证明 perf.zone 有稍微更可靠的基准数字:

  • 在优化 lz-string 时我使用了很长时间的 jsbench.github.io,但在某些时候我注意到某些类型的代码的误差范围非常大,超过 100 %.

  • 运行 移动设备上的基准测试在 jsperf.com 和 perf.zone 上没问题,但 jsbench.github.io 有点卡,CSS 中断而 运行 测试。

也许这两件事是相关的:也许 jsbench.github.io 用来更新 DOM 的方法引入了某种影响基准的开销(他们应该元基准...) .

注意:perf.zone 并非没有缺陷。有时在尝试保存基准时会超时(这样做最糟糕的时间......)并且您只能分叉自己的代码,而不能编辑它。但是输出看起来还是比较符合jsperf的,而且has a really nice "quick" mode for throwaway benchmarking

据我所知,一个问题是各种 JavaScript 引擎根据环境进行优化,差异很大。

我对完全相同的函数进行了测试,该函数会根据函数的创建位置产生不同的结果。换句话说,例如,在一项测试中它是

const lib = {}
lib.testFn = function() {
   ....
}

其他的是

const lib = {
 testFn: function() {
   ....
 },
};

另一个是

function testFn() {
   ....
}

const lib = {}
lib.testFn = testFn

同一浏览器中的非平凡函数的结果差异超过 10%,跨浏览器的结果不同。

这意味着没有 JavaScript 基准是正确的,因为基准 运行 它的测试方式,就像在测试工具本身中一样,会影响结果。例如,线束可能 XHR 测试脚本。可能会调用 eval。可能 运行 测试工人。可能 运行 在 iframe 中进行测试。 JS 引擎可能会以不同的方式优化所有这些。

抱歉打扰了,但其他人可能会感兴趣 运行在搜索结果中加入此内容。

我不能代表其他人,但jsbench.me只是使用benchmark.js进行测试。它是一个单页 React 应用程序,这意味着它 运行 完全在您的浏览器和您选择的引擎上,因此结果在单个浏览器中应该是一致的。您可以在 Firefox 或移动设备中 运行 它,结果当然会有所不同。但是服务器上绝对没有任何与测试相关的东西,除了用于存储结果的 AWS DynamoDB。

P.S。我是作者,所以只是个人的激情项目。目前不会花费我任何费用,因为它针对无服务器进行了优化,并且适合 AWS 免费套餐。它的工作量与用户数量成正比:)