Javascript优化:V8和IE的问题

Javascript Optimization : issue on V8 and on IE

本文关键字:IE 问题 V8 优化 Javascript      更新时间:2023-09-26

我正在尝试优化我的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的问题)