【发布时间】:2011-10-30 23:31:39
【问题描述】:
什么是衡量 javascript 引擎(如 v8 或 spidermonkey)性能的准确方法?它至少应该与一个评估和另一个评估没有太大的偏差,可能允许在不同操作系统和不同硬件配置上的不同 JavaScript 引擎之间进行排名。
我的第一次尝试是在一个没有任何内容的网页中,我在网络浏览器中加载了该页面。然后我尝试在 Google Chrome 的 javascript 控制台中执行此代码,结果非常不同,正如您将在结果中看到的那样:
mean = function (distr) {
var sum = 0;
for (obs in distr) {
sum += distr[obs];
};
return sum / distr.length;
};
stdev = function (distr,mean) {
var diffsquares = 0;
for (obs in distr) {
diffsquares += Math.pow(distr[obs] - mean , 2);
};
return Math.sqrt((diffsquares / distr.length));
};
var OPs = 1000000;
var results = [];
for (var t = 0; t < 60; t++) {
var start = (new Date()).getTime();
for(var i = 0.5; i < OPs; i++){
i++;
}
var end = (new Date()).getTime();
var took = end - start;
var FLOPS = OPs/took;
results.push(FLOPS);
};
average = mean(results);
deviation = stdev(results,average);
console.log('Average: '+average+' FLOPS. Standart deviation: '+deviation+' FLOPS');
它回复了:
NodeJS 0.5.0
- 平均:74607.30446024566 FLOPS。标准偏差: 4129.4008527666265 翻牌
- 平均:73974.89765136827 FLOPS。标准 偏差:4574.367360870471 FLOPS
- 平均:73923.55086434036 FLOPS。 标准偏差:5768.396926072297 FLOPS
Chrome 13.0.782.112(从控制台 (Ctrl+Shift+J))
- 平均:1183.409340319158 FLOPS。标准偏差: 24.463468674550658 翻牌
- 平均:1026.8727431432026 FLOPS。标准 偏差:18.32394087291766 FLOPS
- 平均:1063.7000331534252 翻牌。标准偏差:22.928786803808094 FLOPS
Chrome 13.0.782.112(作为网页)
- 平均:47547.03408688914 FLOPS。标准偏差:4064.7464541422833 FLOPS
- 平均:49273.65762892078 FLOPS。标准偏差:1553.1768207400576 FLOPS
- 平均:47849.72703247966 FLOPS。标准偏差:3445.930694070375 FLOPS
火狐6.0
- 平均:62626.63398692811 FLOPS。标准偏差: 3543.4801728588277 翻牌
- 平均:85572.76057276056 FLOPS。标准 偏差:4336.354514715926 FLOPS
- 平均:63780.19323671495 FLOPS。 标准偏差:3323.648677036589 FLOPS
歌剧 11.50
- 平均:38462.49044165712 FLOPS。标准偏差: 2438.527900104241 翻牌
- 平均:37968.736460671964 FLOPS。标准 偏差:2186.9271687271607 FLOPS
- 平均:38638.1851173518 FLOPS。 标准偏差:1677.6876987114347 FLOPS
发生了一些奇怪的事情。控制台上 Chrome 中的基准测试花费的时间比其他浏览器和 NodeJS 中的要多得多。我的意思是 Chrome 上的 30 秒,而其他的 2 秒。与其他控制台相比,控制台上 Chrome 的标准偏差也非常小。为什么在控制台上执行代码和在网页上执行代码有这么大的区别?
如果这太愚蠢了,让我提醒你,我是在不久前自己“学习”了 javascript(以及一般的代码),所以我在很多事情上都很烂。
对此有什么好的衡量标准?我想关注数学运算的速度,而不是正则表达式速度等其他事情。你有什么推荐的?我还尝试生成 10x10 浮点数矩阵并将它们相乘很多次,结果每次 7、8 或 9 M FLOPS,但在 Chrome 上大多为 7,如果它根本不愚蠢并且有人想要我的代码我很乐意粘贴它。
【问题讨论】:
-
也许读起来很有趣:ejohn.org/blog/accuracy-of-javascript-time。
end - start不可靠。 -
谢谢:D!我很久以前偶然发现了那个,当时并不真正需要,忘记了那篇文章......
-
@pimvdb:看起来它仅对于应该在 15ms 下运行的代码并不可靠,但如果需要 2 秒似乎并不是很重要[来自文章:任何测试的错误率在这些浏览器中运行将是巨大的。如果您有一个在 15 毫秒内运行的简单测试,错误率将高达 50-750%!您需要让测试运行至少 750 毫秒,然后才能安全地将浏览器的错误开销降低到 1%。至少可以这么说,这太疯狂了。]
标签: javascript firefox google-chrome node.js benchmarking