Ven*_*ryx 9 javascript performance benchmarking jsperf
我在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是我的最爱。)
很抱歉遇到了问题,但对于在搜索结果中遇到此问题的其他人来说可能会很有趣。
我不能代表其他人,但 jsbench.me 只是使用 benchmark.js 进行测试。它是一个单页 React 应用程序,这意味着它可以完全在您的浏览器和您选择的引擎上运行,因此结果在单个浏览器中应该是一致的。您可以在 Firefox 或移动设备中运行它,结果当然会有所不同。但是除了用于存储结果的 AWS DynamoDB 之外,服务器上绝对没有与测试相关的任何内容。
PS我是作者,所以只有个人的激情项目。目前我不需要花费任何费用,因为它针对无服务器进行了优化,并且适合 AWS 免费套餐。工作量与用户数量成正比:)
2019年3月更新: Firefox和Chrome之间的结果不一致 -perf.zone在Chrome上表现异常,jsben.ch在Firefox上表现异常。直到我们确切知道为什么最好的方法是在多个网站上进行基准测试(但我仍然跳过jsben.ch,其他网站至少为您提供了一些错误裕度和运行次数的统计信息,依此类推)
TL; DR:在perf.zone和jsbench.github.io上运行您的代码(请参阅此处和此处),结果与jsperf非常匹配。就个人而言,由于除这些结果以外的其他原因,我比jsben.ch更信任这三个网站。
最近,我也尝试对字符串连接的性能进行基准测试,但就我而言,它是在1000000+个单个字符串中构建一个字符串(join('')
对于如此大的数字必胜,btw)。在我的机器上,jsben.ch超时而不是给出结果。也许对您来说效果更好,但是对我来说,这是一个很大的警告信号:
http://jsbench.github.io/#26d1f3705b3340ace36cbad7b24055fb
(对不起,我不必not all tests inserted
再再次处理jsperf 了,对不起)
目前,我怀疑但无法证明 perf.zone具有稍微更可靠的基准数字:
优化lz-string时,我使用jsbench.github.io的时间很长,但是在某些时候,我注意到某些类型的代码存在不可思议的错误余量,超过100%。
使用jsperf.com和perf.zone可以在移动设备上运行基准测试很好,但是jsbench.github.io有点笨拙,并且在运行测试时CSS会中断。
也许这两件事是相关的:也许jsbench.github.io用于更新DOM的方法引入了某种会影响基准的开销(它们应该进行元基准测试……)。
注意:perf.zone并非没有缺陷。尝试保存基准时有时会超时(最差的时间...),您只能派生自己的代码,而不能对其进行编辑。但是输出似乎仍然与jsperf更加一致,并且它具有用于丢弃基准测试的非常好的“快速”模式
据我所知,一个问题是各种 JavaScript 引擎根据环境进行的优化差异很大。
我对完全相同的函数进行了测试,该函数根据创建函数的位置产生不同的结果。换句话说,例如,在一项测试中
const lib = {}
lib.testFn = function() {
....
}
Run Code Online (Sandbox Code Playgroud)
而在其他方面则是
const lib = {
testFn: function() {
....
},
};
Run Code Online (Sandbox Code Playgroud)
而在另一个则是
function testFn() {
....
}
const lib = {}
lib.testFn = testFn
Run Code Online (Sandbox Code Playgroud)
同一浏览器中的重要函数的结果存在 >10% 的差异,而不同浏览器的结果则不同。
这意味着没有 JavaScript 基准测试是正确的,因为基准测试运行测试的方式(如测试工具本身)会影响结果。例如,该工具可能会 XHR 测试脚本。可能会调用 eval。可能会在工作人员中运行测试。可能会在 iframe 中运行测试。JS 引擎可能会以不同的方式优化所有这些。