Javascript 与Ember.get()相比,关闭/可以关闭的var有多贵?
对于不同的x值,哪个更贵Javascript 与Ember.get()相比,关闭/可以关闭的var有多贵?,javascript,performance,ember.js,Javascript,Performance,Ember.js,对于不同的x值,哪个更贵 bob: function(){ var result = 1; var has_a_garbage_collection_cost = this.get('someProperty'); function() { for (i=0;i<x;i++) { result = result * has_a_garbage_collection_cost; } } return result; }.property(
bob: function(){
var result = 1;
var has_a_garbage_collection_cost = this.get('someProperty');
function() {
for (i=0;i<x;i++) {
result = result * has_a_garbage_collection_cost;
}
}
return result;
}.property()
bob:function(){
var结果=1;
var有垃圾收集成本=this.get('someProperty');
函数(){
对于(i=0;i它实际上比我预期的更接近,老实说,更好的方法就是传递它,这样它就不会随闭包一起引入
感谢kingpin2k制作了一个jsperf。虽然他没有闭包,所以我编辑它添加了一个闭包,效果实际上相当大。不管x是什么,一个get
的成本与创建一个var
的成本相比是完全相形见绌的,这个var必须在垃圾收集器运行之前一直存在。Assu明:当然,你所得到的是某种标量
样本结果:
在var上关闭,5次使用,循环10次
函数v3(){
var结果=1;
var有垃圾收集成本=something.get('something');
闭包=函数(){
对于(i=0;对我来说这听起来像是一个荒谬的微优化。很明显,只运行一次函数要比运行一百次快。我不知道垃圾收集与此有什么关系,你认为分配一个小变量会有很大的不同吗?或者,等等,你甚至没有调用函数expression?那么不计算this.get('someProperty');
会比计算它快。bergi,这个函数纯粹是为了说明一点。如果一个计算属性被激发(荒谬)由于在闭包中使用而必须保留的变量的垃圾收集次数变得非常重要。@Mathletics 99%的时间是这样的,不幸的是,我有一组相关的计算属性,在它们解决之前会触发大量次。希望我能找出如何让它们触发更少的次数,在与此同时,我一直在减少它们触发频率的影响。我的示例不清楚。在您的jsperf中,看起来var更快。但这里有一个版本实际上在var上创建了一个闭包,它清楚地显示了垃圾收集成本——var版本慢了73%。@kinkgin2k,我还怀疑在属性中效果是mul不知怎么搞的。因为即使是70%的差异也不足以解释我从一些相关属性中删除几个一次性变量所获得的速度。你必须确保运行它足够多的时间,垃圾收集器才能启动。在我机器上的chrome上,它通常在有几兆字节的垃圾要收集之前不会启动。在有趣的是,垃圾收集效应完全占主导地位。多次以编程方式使用引用对时间没有影响(也没有使用var)。明确多次使用引用与var成本相比也完全相形见绌。我用所有这些发现添加了一个答案。
bob: function(){
var result = 1;
function() {
for (i=0;i<x;i++) {
result = result * this.get('someProperty');
}
}
return result;
}.property()
function v3() {
var result = 1;
var has_a_garbage_collection_cost = something.get('something');
closure = function() {
for (i=0;i<10;i++) {
result = result + has_a_garbage_collection_cost;
result = result + has_a_garbage_collection_cost;
result = result + has_a_garbage_collection_cost;
result = result + has_a_garbage_collection_cost;
result = result + has_a_garbage_collection_cost;
}
}
closure();
return result;
}
v3(100000);
function r3() {
var result = 1;
closure = function() {
for (i=0;i<10;i++) {
result = result + something.get('something');
result = result + something.get('something');
result = result + something.get('something');
result = result + something.get('something');
result = result + something.get('something');
}
}
closure();
return result;
}
r3(100000);