也许不是因为调用很慢,而是查找; 我不确定,但这是一个例子:
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');
Run Code Online (Sandbox Code Playgroud)
在win8.1上测试过
现在这里是有趣的部分,如果我bar.fn改为bar.somethingelse:
最近v8出了什么问题?是什么导致这个?
我正在编写一个JS对象,需要在字符串:函数对上执行真正基本的键值缓存.该类在客户端上运行并缓存部分编译的模板以呈现页面的一部分,因此它可能具有20-200个项目.
在实际编写类之前,我认为查看最快的缓存检索方法是个好主意.想到的选项是:
1.基本财产访问:
if (x[k] !== undefined) {
v = x[k];
}
Run Code Online (Sandbox Code Playgroud)
2.钥匙检查(自己):
if (x.hasOwnProperty(k)) {
v = x[k];
}
Run Code Online (Sandbox Code Playgroud)
3.钥匙检查(一般):
if (k in x) {
v = x[k];
}
Run Code Online (Sandbox Code Playgroud)
我假设3将是最快的(检查属性是否存在但不检索它或担心它存在的位置)并且1将是最慢的(实际获得属性,即使它没有做任何事情).
将所有这些放入jsPerf产生了一些非常奇怪的结果.在Chrome(和Chromium)和IE中,#1的速度大约是其两倍.在Firefox中,#3有一个小优势,但三者之间的性能相似.无论我是否在VM中运行都没关系,并且版本之间没有太大的变化.
我在解释这些结果时遇到了麻烦.可能#1注意到数据不会发生任何事情,因此只是在内部检查密钥,但为什么它比#3更快?为什么#3没有得到相同的优化?
是什么导致这些结果?是否有一些JIT优化我可能会对数据产生偏差?
更重要的是,为什么浏览器之间的差异如此之大,所有选项在FF中都大致相同?
JavaScript属性访问的性能特征是什么(在当前实现上)?
如果我使用一个对象作为哈希表(使用字符串键),我可以安全地假设O(1)或O(log n)访问时间吗?
是否有任何常见的浏览器或环境比其他浏览器或环境明显更快/更慢,我应该留意?
JavaScript标准有什么要说的吗?
最重要的是: