Hug*_*rth 10 javascript performance prototype
这似乎是一个特别模糊的观点,但是我试图提高我在整个Javascript语言中的基础(更具体地说,它是最好和最有效的实践).
在http://jsperf.com/中测试理论时,我想出了一些奇怪的结果:
假设我们有两个"相同"的原型,定义如下:
Object1
var Object1 = function() {}
Object1.prototype.defaults = {
radius: 400,
up: 1
}
Object1.prototype.centerOffset = function() {
return this.defaults.radius*this.defaults.up;
}
Run Code Online (Sandbox Code Playgroud)
对象2
var Object2 = function() {}
Object2.prototype = {
defaults: {
radius: 400,
up: 1
},
centerOffset: function() {
return this.defaults.radius*this.defaults.up;
}
}
Run Code Online (Sandbox Code Playgroud)
Object1具有一致的(如果边际:〜3%)的速度优势超过Object2的执行以下简单的操作时:
var o = new Object1();
var offset = o.centerOffset();
Run Code Online (Sandbox Code Playgroud)
&
var o = new Object2();
var offset = o.centerOffset();
Run Code Online (Sandbox Code Playgroud)
你可以在这里自己运行测试.我在OSX 10.6.8上使用Chrome 25.
我想知道的是:
先谢谢你们.
编辑:感谢您的回复 - 正如一些人所提到的,我的进一步测试似乎表明这个问题是浏览器(或者更确切地说,是Javascript编译器特定的).我还在Safari,IE 10和Firefox中进行了测试.IE 10和Firefox都给出了非常接近的结果.Safari对Object2执行的操作比Object1上的操作略快(平均约为2%).我想知道异常值(其他)是什么,因为在这种情况下的性能差异似乎很大.
小智 3
当您声明函数时,其原型属性将使用包含默认构造函数的对象进行初始化。
对于 Object1,您将向现有原型函数添加一个属性。使用 Object2,您可以用自己的无构造函数替换现有原型。
两者并不相同。
为什么速度不同?好吧,每次创建实例时,V8 都可以向 object2 原型添加一个构造函数。
或者更有可能的是,预先存在的原型函数是用机器代码实现的,以使其更快,当您将自己的对象分配给 Object2.prototype 时,原型函数现在是纯 JavaScript,因此速度较慢。
细节并不那么重要,因为不同的解释器会以不同的方式处理这个问题,重要的是要意识到Object1和Object2并不完全相同。
| 归档时间: |
|
| 查看次数: |
431 次 |
| 最近记录: |