相关疑难解决方法(0)

当对不同对象中的函数使用相同的键时,在V8中调用慢函数

也许不是因为调用很慢,而是查找; 我不确定,但这是一个例子:

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上测试过

  • 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出了什么问题?是什么导致这个?

javascript performance google-chrome v8 node.js

50
推荐指数
2
解决办法
1908
查看次数

为什么比调用hasOwnProperty更快地获得成员?

我正在编写一个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 performance

25
推荐指数
1
解决办法
2208
查看次数

Javascript big-O属性访问性能

JavaScript属性访问的性能特征是什么(在当前实现上)?

  • 假设数组访问是O(1)是否安全?
  • 如果我使用一个对象作为哈希表(使用字符串键),我可以安全地假设O(1)或O(log n)访问时间吗?

  • 是否有任何常见的浏览器或环境比其他浏览器或环境明显更快/更慢,我应该留意?

  • JavaScript标准有什么要说的吗?

最重要的是:

  • 我在哪里可以找到这种渐近的JavaScript性能问题的好参考?

javascript

15
推荐指数
1
解决办法
3671
查看次数

标签 统计

javascript ×3

performance ×2

google-chrome ×1

node.js ×1

v8 ×1