12

我在 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)

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

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

编辑

扩展的基准列表:

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

(目前http://jsbench.me是我的最爱。)

4

3 回答 3

10

2019 年 3 月更新: Firefox 和 Chrome 之间的结果不一致- perf.zone 在 Chrome 上表现异常,jsben.ch 在 Firefox 上表现异常。在我们确切知道原因之前,您能做的最好的事情就是在多个网站上进行基准测试(但我仍然会跳过 jsben.ch,其他网站至少会给您一些误差幅度和运行次数的统计数据,等等)

TL;DR:在perf.zonejsbench.github.io上运行您的代码(请参阅此处此处),结果与 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

(我懒得再处理 jsperfnot 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,并且它有一个非常好的“快速”模式用于一次性基准测试

于 2017-12-05T17:57:13.010 回答
9

很抱歉出现了问题,但对于在搜索结果中遇到此问题的其他人来说可能会很有趣。

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

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

于 2020-01-08T10:20:23.770 回答
5

AFAIK 的一个问题是各种 JavaScript 引擎根据环境进行了非常不同的优化。

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

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

而在其他方面

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

在另一个是

function testFn() {
   ....
}

const lib = {}
lib.testFn = testFn

并且对于同一浏览器中的非平凡函数的结果以及跨浏览器的不同结果存在> 10%的差异。

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

于 2019-04-05T00:22:09.657 回答