【问题标题】:Which JS benchmark site is correct?哪个 JS 基准测试网站是正确的?
【发布时间】:2017-11-20 13:53:51
【问题描述】:

我在 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.me是我的最爱。)

【问题讨论】:

    标签: javascript performance benchmarking jsperf


    【解决方案1】:

    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 有点笨拙,并且在运行测试时 CSS 会中断。

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

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

    【讨论】:

    • 在我对 jsbench.ch 的最新测试中,一个空代码块的结果超过了 40%。看起来计时器正在计时的不仅仅是你的代码。
    • 是的,很遗憾,perf.zone 已离线。因此失去了很多个基准测试:(
    • 是的,我注意到 :( 也许它被滥用于盗版/黑客目的?jsperf 过去也遇到过这个问题:github.com/jsperf/jsperf.com/issues/436github.com/jsperf/jsperf.com/issues/232
    • 嗯,这是一个人的激情项目,没有人愿意参与其中,所以我猜他决定不再为此付费。我不能怪他。源代码仍然存在于 GitHub 上
    • 看起来 perf.zone 重新上线了! :)
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您制作 jsbench.me 不幸的是,对于许多类型的测试来说,大小限制太小了。特别是设置的 2k 限制远远不够。
    • @gman,是的,我知道这一点。从技术上讲,修复它非常容易,配置在那里并且准备就绪,但在财务上,我有各种限制以将其保持在 AWS 免费套餐限制内。我正在研究某种最小化货币化的方式来解除这些限制。应该是捐款吧。密切关注它,我希望在未来几个月内改变它。或者只需订阅此问题,您就会收到通知:github.com/psiho/jsbench-me/issues/24
    【解决方案3】:

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

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

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

    在其他方面是

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

    另一个是

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

    在同一浏览器中的非平凡函数的结果和跨浏览器的不同结果存在 >10% 的差异。

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

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 2010-12-03
      • 2010-12-22
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      相关资源
      最近更新 更多