有什么更好的:创build一个新的variables或赋值给一个对象字段?

我想知道什么会更快执行。

我想有一个临时variables,将用于一些函数内的一些计算。 attackerdefender对象将在以后使用,其中创build的所有东西都应该被删除。

首先,我有一个创build临时dmgvariables的方法来存储attackerdefender的损害。

  var dmg; dmg.attacker = 10; dmg.defender = 10; var battle = function (dmg, attacker, defender) { //Some calculations using dmg.attacker and dmg.defender. } 

第二种方法是,我在里面存储attackedefender dmg 。 如果程序的其他部分在dmg被删除之前捕获attacker/defender对象,则不会有任何问题。

  attacker.dmg = 10; defender.dmg = 10; var battle = function (attacker, defender) { //Some calculations using attacker.dmg and defender.dmg. delete attacker.dmg; delete defender.dmg; } 

那么,哪个实施会更快,为什么呢? 还有其他更好的select吗? 我正在使用节点4 LTS,它有没有我不知道的细微差别?

性能应该成为最终的指导因素,尤其是没有掌握分析器的情况下。 让可维护性和生产力成为这里的指导力量,直到事后才开始测量热点。

这就是说,就像一般的经验法则,你的状态变化和访问的地方越多,通常它们会变得越快。 从性能的观点来看,更多本地访问局部variables比更多地访问更less但更多的全局variables更可取。

当地的国家很快

当大量信息可用时,优化编译器会尽其所能。 分析函数的局部variables时,有效的寄存器分配和指令select要比全局variables的范围远远大于可以在任何地方修改和访问的函数。

效率的关键往往是围绕从较慢但较大的内存(例如DRAM)加载到较快但较小的内存(一级caching线,然后注册)来进行。 快速的代码意味着在那些更快,但更小的内存forms(例如寄存器)内尽可能地保留和使用经常访问的内存。 当你的variables具有一个非常本地的范围时,编译器就可以做到这一点,因为它不需要在范围之外查看它是否需要将variables溢出到堆栈中,或者可以保存在寄存器中。

因此,作为一般的经验法则,更多的地方政府更倾向于范围更广的全球性国家。 这不仅有助于提高效率,还能减less人为错误*。

*请注意,这与assembly思维相反。 在汇编中,尽可能重用寄存器有助于避免堆栈溢出。 在有variables而不是直接寄存器访问的语言中,更多的局部variables可以帮助编译器找出它可以重用的寄存器。

具体例子

在这个特定情况下,添加成员并从关联结构中删除它们(对象适合JS中的这种情况)往往比创build成员更加昂贵,并且简单地将其作为整体丢弃。 这些行:

 delete attacker.dmg; delete defender.dmg; 

…比构造一些临时对象更具成本效益,当你完成这个任务时,把它作为一个整体简单地销毁,而不是把成员添加到一个更全局的对象,然后在完成时删除它们。

作为一个加号,这也应该是一个less一点的错误倾向,所以你也获得了奖金。 作为第二个加号,假设attackerdefender范围相当广泛,这个创build这个dmgvariables的函数将避免对这些对象的副作用,因此它将是线程安全的,因为它只处理本地状态(假设这是所有的做和不修改其他全局)。

如果你真的很挑剔,最好是将攻击者的伤害和防御者的伤害作为两个单独的标量,而不是聚合成一个物体,并通过两种forms的损害这个battlefunction。 但是,这实际上降低了代码的可读性,而且你应该只用手中的一个分析器来告诉你这是一个热点问题。

根据下面的代码片段的结果,第一种方法要快得多。

 var dmg = {}; var battleDmg = function (dmg) {}; var start = new Date().getTime(); for(var i = 0; i < 100000; i++) { dmg.attacker = 10; dmg.defender = 10; battleDmg(dmg); } console.log('dmg:' + (new Date().getTime() - start)); var attacker = {}, defender = {}; var battleAttackerVsDefender = function (attacker, defender) { delete attacker.dmg; delete defender.dmg; }; start = new Date().getTime(); for(i = 0; i < 100000; i++) { attacker.dmg = 10; defender.dmg = 10; battleAttackerVsDefender(attacker, defender); } console.log('a vs d:' + (new Date().getTime() - start));