Javascript 更好的方法是:创建新变量或将值指定给对象字段?

Javascript 更好的方法是:创建新变量或将值指定给对象字段?,javascript,node.js,performance,Javascript,Node.js,Performance,我想知道什么能更快地实施 我想要一个临时变量,用于函数内部的一些计算。稍后将使用攻击者和防御者对象,并删除其中创建的所有内容 首先,我有一种方法可以创建一个临时dmg变量来存储攻击者和防御者的伤害 var dmg; dmg.attacker = 10; dmg.defender = 10; var battle =

我想知道什么能更快地实施

我想要一个临时变量,用于函数内部的一些计算。稍后将使用
攻击者
防御者
对象,并删除其中创建的所有内容

首先,我有一种方法可以创建一个临时
dmg
变量来存储
攻击者
防御者
的伤害

                    var dmg;
                    dmg.attacker = 10;
                    dmg.defender = 10;           
                    var battle = function (dmg, attacker, defender) {
                        //Some calculations using dmg.attacker and dmg.defender.        
                    }
第二种方法是,我将
attacke
r和
defender
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;                            
                    }

那么,哪种实现更快?为什么?还有其他更好的选择吗?我使用的是Node 4 LTS,是否有我不知道的细微差别?

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

也就是说,正如一般的经验法则一样,您的状态更改和访问越是本地的,它们通常会越快。从性能角度来看,更多地访问局部变量比更多地访问更少但更多的全局变量更可取

本地州的速度很快

当大量信息随时可用时,优化编译器会尽最大努力。在分析函数的局部变量时,有效的寄存器分配和指令选择比全局变量更容易,全局变量的范围比可以在任何地方修改和访问的函数大得多

效率的关键通常是从较慢但较大的内存(例如DRAM)加载到较快但较小的内存(一级缓存线,然后是寄存器)。使代码快速意味着在那些速度更快但更小的内存(例如寄存器)中尽可能多地保留和使用频繁访问的内存。当您的变量有一个非常局部的作用域时,编译器更容易做到这一点,因为它不必查看该作用域之外的变量,以查看是否需要将变量溢出到堆栈中,或者是否可以将其保留在寄存器中,例如

因此,一般的经验法则是,与范围更广的全局状态相比,更喜欢范围更短的局部状态。这不仅可以提高效率,还可以减少人为错误*

*请注意,这与组装思维相反。在汇编中,尽可能多地重用寄存器以避免堆栈溢出是很有帮助的。在使用变量而不是直接访问寄存器的语言中,更多的局部变量有助于编译器确定可以重用哪些寄存器

具体示例

在这种特定情况下,添加成员并将其从关联结构中移除(对象适合JS中的这种情况)往往比创建一个成员并将其作为一个整体丢弃要昂贵。这些线路:

delete attacker.dmg;
delete defender.dmg;
。。。具体来说,这比构建一些临时对象并在完成后将其作为一个整体销毁要昂贵得多,而不是将成员添加到一个更全局的对象中,然后在完成后将其删除

另外,这也应该不那么容易出错,所以你也可以得到奖励。另外,假设
attacker
defender
具有相当广泛的作用域,则创建此
dmg
变量的函数将避免对这些对象产生副作用,因此将是线程安全的,因为它只处理局部状态(假设这就是它所做的全部,而不修改其他全局状态)


如果你真的对此很挑剔,最好将攻击者伤害和防御者伤害作为两个独立的标量创建,而不是聚合成一个对象,并将这两种形式的伤害传递给此
战斗
功能。但这确实降低了代码的可读性,而且你只应该用你手中的探查器来告诉你这是一个热门话题。

这不是那种性能应该成为最终指导因素的事情,尤其是没有探查器在手的情况下。让可维护性和生产力成为这里的指导力量,直到您事后开始测量热点

也就是说,正如一般的经验法则一样,您的状态更改和访问越是本地的,它们通常会越快。从性能角度来看,更多地访问局部变量比更多地访问更少但更多的全局变量更可取

本地州的速度很快

当大量信息随时可用时,优化编译器会尽最大努力。在分析函数的局部变量时,有效的寄存器分配和指令选择比全局变量更容易,全局变量的范围比可以在任何地方修改和访问的函数大得多

效率的关键通常是从较慢但较大的内存(例如DRAM)加载到较快但较小的内存(一级缓存线,然后是寄存器)。使代码快速意味着在那些速度更快但更小的内存(例如寄存器)中尽可能多地保留和使用频繁访问的内存。当您的变量有一个非常局部的作用域时,编译器更容易做到这一点,因为它不必查看该作用域之外的变量,以查看是否需要将变量溢出到堆栈中,或者是否可以将其保留在寄存器中,例如

因此,一般的经验法则是,与范围更广的全局状态相比,更喜欢范围更短的局部状态。这不仅可以提高效率,还可以减少人为错误*

*请注意,这与组装思维相反。在汇编中,尽可能多地重用寄存器是有帮助的