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

问题描述 投票:6回答:2

我在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提到:它没有显示运行次数,错误余量或每秒操作次数 - 对于估计绝对性能影响以及在基准站点和/或浏览器与浏览器版本之间进行稳定比较非常重要。

(目前http://jsbench.github.io是我最喜欢的,因为它具有所有核心功能,并且允许您在本地编辑代码片段而无需每次都保存新版本。最大的负面影响是它不会让您只运行一个代码片段 - - 我已经为此提交了功能请求。)

javascript performance benchmarking jsperf
2个回答
4
投票

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

TL; DR: 在perf.zonejsbench.github.io上运行你的代码(参见herehere),结果与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有点janky并且CSS在运行测试时中断。

也许这两件事是相关的:也许jsbench.github.io用来更新DOM的方法引入了一些影响基准测试的开销(他们应该对这个基准进行元基准测试......)。

注意:perf.zone并非没有缺陷。在尝试保存基准测试时(有时候这是最糟糕的时间......),它有时会超时,你只能分叉自己的代码,而不是编辑它。但输出似乎仍然更符合jsperf,而且has a really nice "quick" mode for throwaway benchmarking


0
投票

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

我测试完全相同的函数,根据函数的创建位置产生不同的结果。换句话说,例如,在一次测试中,它就是

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

而在其他方面

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

而在另一个

function testFn() {
   ....
}

const lib = {}
lib.testFn = testFn

并且在同一浏览器中的非平凡功能和跨浏览器的不同结果的结果差异> 10%。

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

© www.soinside.com 2019 - 2024. All rights reserved.