Javascript 画布动画性能优化。是否有开销呼叫';这个';?
我正在优化HTML5画布动画 结构如下所示:Javascript 画布动画性能优化。是否有开销呼叫';这个';?,javascript,canvas,Javascript,Canvas,我正在优化HTML5画布动画 结构如下所示: Animation = { //Cache constant variables cache : { var1 : 1, var2 : 2, var3 : 3 }, render : function(){ //render to canvas } } 在渲染函数中,我正在调用this.cache.var1,this.ca
Animation = {
//Cache constant variables
cache : {
var1 : 1,
var2 : 2,
var3 : 3
},
render : function(){
//render to canvas
}
}
在渲染函数中,我正在调用this.cache.var1
,this.cache.var2
等。。。在整个过程中多次对其执行各种计算
我想知道的是,在单个循环中重复调用this
是否会带来很大的开销,如果是这样,如何最好地优化它
我是否应该简单地在渲染循环(self=this;
)中存储一个本地副本并从self
开始工作,我是否应该最小化各种重复计算,将它们分解为各个部分,将它们作为局部变量存储在循环中并从这些部分开始工作
欢迎提出任何意见
注意:我知道这可能被认为是微优化,但当处理繁重的动画处理时,我真的很想挤出我能得到的每一滴
提前谢谢
欢迎提出任何意见
你不需要意见,你需要的是硬数据!:)致:
在Chrome上使用闭包稍微快一点,在Firefox上慢一倍,在IE9上差不多。将对this.cache
的引用缓存为var cache=this.cache
会略微提高某些浏览器的速度。但是,速度差异不足以在您编写的任何代码中产生显著影响。如结果所示,我的测试以每秒数亿次的查找速度运行(每秒5000万次操作*3次查找),其中大部分可能与函数调用的开销相形见绌
关注画布绘图和任何循环算法,而不是单个代码行
欢迎提出任何意见
你不需要意见,你需要的是硬数据!:)致:
在Chrome上使用闭包稍微快一点,在Firefox上慢一倍,在IE9上差不多。将对this.cache
的引用缓存为var cache=this.cache
会略微提高某些浏览器的速度。但是,速度差异不足以在您编写的任何代码中产生显著影响。如结果所示,我的测试以每秒数亿次的查找速度运行(每秒5000万次操作*3次查找),其中大部分可能与函数调用的开销相形见绌
专注于你的画布绘制和任何循环算法,而不是单独的代码行。a)小心过早的优化(特别是当你不选择算法,而只是代码的变化时)::b)你很容易自己测试这一点(并发现它没有可测量的差异)。实际绘图可能比访问属性花费的时间要长。谢谢Phrogz,如果确实是这样,请重新键入它作为答案,我很乐意接受。关于测试我自己,我很抱歉,如果我知道怎么做,我会这么做的。无论如何,谢谢你的评论。:)a) 小心过早的优化(特别是当你不选择算法,而只是代码的变化时)::b)你很容易自己测试它(并发现它不会产生可测量的差异)。实际绘图可能比访问属性花费更长的时间。感谢Phrogz,如果真是这样的话,请重新输入答案,我很乐意接受。关于测试我自己,我很抱歉,如果我知道怎么做,我会这么做的。无论如何,谢谢你的评论。:)真棒的回答,弗罗兹。。。非常感谢。我们学到了一些好东西。我也在那里做基准测试。干杯:-)回答得很好,但对被问到的问题回答得不太好。OP似乎最感兴趣的是
render()
内部的本地self
变量是否会更快,而不是闭包。@MattGreer啊,我想你可能是对的。我在第一次阅读时没有理解这一点。我已经更新了测试以包含此变化。结果是,在某些浏览器中,将缓存
对象缓存为局部变量比显式使用这个.cache
快一点(在Chrome上,关闭速度稍快,在Firefox上则慢得多)。。。非常感谢。我们学到了一些好东西。我也在那里做基准测试。干杯:-)回答得很好,但对被问到的问题回答得不太好。OP似乎最感兴趣的是render()
内部的本地self
变量是否会更快,而不是闭包。@MattGreer啊,我想你可能是对的。我在第一次阅读时没有理解这一点。我已经更新了测试以包含此变化。结果是,在某些浏览器中,将缓存
对象作为局部变量缓存比显式使用this.cache
要快得多(在Chrome上,关闭速度稍快,在Firefox上则慢得多)。
Anim1 = {
cache: { var1:1, var2:2, var3:3 },
render: function(){
return this.cache.var1 + this.cache.var2 + this.cache.var3;
}
};
AnimMaker = function(){
var cache = { var1:1, var2:2, var3:3 };
this.render = function(){
return cache.var1 + cache.var2 + cache.var3;
}
};
Anim2 = new AnimMaker;
Anim3 = {
cache: { var1:1, var2:2, var3:3 },
render: function(){
var cache = this.cache;
return cache.var1 + cache.var2 + cache.var3;
}
};
// Now compare Anim1.render() vs Anim2.render() vs Anim3.render()