【发布时间】:2015-03-27 21:05:44
【问题描述】:
也许不是因为调用慢,而是查找慢;我不确定,但这里有一个例子:
var foo = {};
foo.fn = function() {};
var bar = {};
bar.fn = function() {};
console.time('t');
for (var i = 0; i < 100000000; i++) {
foo.fn();
}
console.timeEnd('t');
在win8.1上测试
- firefox 35.01:~240ms
- 铬 40.0.2214.93 (V8 3.30.33.15): ~760ms
- msie 11:34 秒
- nodejs 0.10.21 (V8 3.14.5.9): ~100ms
- iojs 1.0.4 (V8 4.1.0.12): ~760ms
现在这是有趣的部分,如果我将 bar.fn 更改为 bar.somethingelse:
- 铬 40.0.2214.93 (V8 3.30.33.15): ~100ms
- nodejs 0.10.21 (V8 3.14.5.9): ~100ms
- iojs 1.0.4 (V8 4.1.0.12): ~100ms
最近 v8 出了什么问题?这是什么原因造成的?
【问题讨论】:
-
我在 Chrome 中得到了相同的结果。没在IE里测试,但是真的要34秒吗?
-
是的,但它第一次崩溃。即可爱:)
-
同样奇怪的是,io.js 使用更新版本的引擎比 node.js 慢得多,而 chrome 比使用几乎相同引擎的 node.js 慢得多。跨度>
-
我的猜测(完全任意)是这与在同一范围内具有相似结构的两个动态(ish)对象有关,但不能保证相同,从而导致问题the caches used for monomorphism 并导致一个查找被取消优化。不过,这完全是不可能的。对实际答案非常感兴趣。
-
不管嵌套多少,
foo.one.fn和bar.two.fn都会导致相同的延迟
标签: javascript node.js performance google-chrome v8