Javascript优化:V8和IE的问题
Javascript Optimization : issue on V8 and on IE
我正在尝试优化我的Javascript游戏引擎。我遇到了很多问题,但这里有两个让我有点无能为力。
我有一个类代表玩家在游戏中的单位。玩家有4个单位,都是在游戏开始时创建的。
我用了一些很简单的东西,就像这样:
function PartyCharacter()
{
this.Armor ;
this.FireResistance ;
this.CriticalStrike ;
// a hundred more like that
}
我认为没有初始化的属性值不是很安全/好的设计,它可能会损害javascript优化关于变量的类型,所以我给他们分配了一个基本值:
function PartyCharacter()
{
this.Armor = 0 ;
this.FireResistance = 0 ;
this.CriticalStrike = 0 ;
// a hundred more like that
}
它让我在firefox上的性能有了一点提升,但在chrome上却让我的整体性能下降了300%。我很难弄清楚是什么引起的。我注意到的唯一一件事是,性能下降发生在一定数量的变量初始化之后(比如15个左右)。如果我只初始化14,性能保持"正常"。只要多添加一个"= 0",性能就会下降,而且下降得很厉害。
我已经检查了chrome分析器,问题似乎是它现在无法优化代码中的其他函数(对函数进行了太多优化)。与这个新的V8优化问题有关的2个函数不直接与玩家的单元交互,但它们确实调用了其他函数。我已经尝试过在V8上跟踪,但因为我在窗口上,只是将标准输出重定向到一个辅音窗口是一种痛苦,窗口不允许复制/粘贴,而且太垃圾了,无法读取和获取信息。
我对那种行为有点不了解。
同样地,我考虑将这些变量声明为原型,因为玩家单位的所有实例都使用它们。它让我在FF和Chrome上的性能都下降了20%。我不明白这是为什么。
如果有帮助的话:我经常访问这些变量,也经常改变它们的值。
function PartyCharacter()
{
}
PartyCharacter.prototype.Armor = 0 ;
PartyCharacter.prototype.FireResistance = 0 ;
PartyCharacter.prototype.CriticalStrike = 0 ;
另一件让我困惑的事情是不同浏览器的性能差异。FF/Chrome差不多,但IE总是慢3倍。
我试着用60秒来分析游戏,看看IE上是否有任何瓶颈,但单看分析结果,我认为IE更快,否则我一定错过了什么。
我知道FF(使用firebug)和IE的分析器工作方式有点不同,但我无法解释我的分析会话的结果。
在两个会话中,函数调用的数量比例是相同的。所以游戏逻辑不会对IE产生影响,只有在功能内部花费的时间才能解释速度差异。
我看到在IE上,我有两个函数的"自我"时间(不包括内部调用的函数)比FF上的对应函数高得多:IE上33%+17%,FF上7%+2%。
问题是这些函数在IE上的平均运行时间比在FF上要短。
这意味着在两个浏览器上调用相同次数的函数在IE上执行得更快,但同时在整个游戏过程中花费更多时间?哪里出了问题....但我不知道是什么。
这是我的分析数据的粘贴:http://pastebin.com/sjxWaz6p#
IE也是一样:http://pastebin.com/9NW1E0bg#
复制/粘贴原始数据在excel和你的' good to go !
一般来说,在构造函数中初始化字段肯定是有意义的,并且应该会导致性能改进。您的第一个代码片段(function PartyCharacter() { this.Armor ; ...
)没有创建任何字段。它读取不存在的.Armor
字段,因此读取返回undefined
;不以任何方式改变对象;而且V8也不会把这当作稍后会创建该属性的暗示。
初始化这些字段时看到的减速可能是由于其中存储了不同的类型。V8对类字段做了一些类型跟踪,但是当这些类型在执行后期发生变化时,这会导致性能损失。以后存储的所有值都是整数吗?他们会是双胞胎吗?它们是字符串/布尔值/对象吗?尝试将字段初始化为undefined
(如果稍后它们将存储对象;或者NaN
(如果它们只是数字),看看是否有帮助。
在原型上初始化属性是没有帮助的,如果你以后要覆盖它们(因为那些写不会到原型,他们会在对象本身上创建字段)。另一方面,如果它们是"常量"(即从未改变过),那么将它们存储在原型中是保存它们的最节省内存的方法。
(我对其他浏览器一无所知,所以我不能帮助解决有关FF/IE的问题)
- 弯曲拐角IE 7,8问题
- jQuery AJAX 上传系统 IE 问题
- 从父页面调用iframe中的javascript,IE问题
- IE 8问题(使用js)
- Nic编辑新的上传IE问题
- 自定义模式脚本 - Safari 和 IE 问题
- JavaScript for .在循环 IE 问题中
- 使用 YQL 使用 jQuery 解析 XML(IE 问题)
- 输入类型提交的 IE 问题
- 液体布局IE问题,当然(新手)
- 在菜单上滚动交换类 - IE 问题
- jQuery预加载程序ie-6/7问题
- 重新初始化内联编辑器时的IE问题
- jQuery ie问题与粘贴(内容与中断)
- javascript IE问题.仅在IE中不工作
- selenium webdriver中的IE问题
- IE 7/8问题-无法获取属性'id': object的值为空或未定义
- 通过javascript从xml文件更新对象(IE问题)
- javascript背景大小和IE问题
- IE问题:可见