Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript性能:多个变量还是一个对象?_Javascript_Performance - Fatal编程技术网

JavaScript性能:多个变量还是一个对象?

JavaScript性能:多个变量还是一个对象?,javascript,performance,Javascript,Performance,这只是一个简单的性能问题,帮助我理解javascript引擎。 为此,我想知道什么更快:为某些值声明多个变量,或者使用一个包含多个值的对象 例如: var x = 15; var y = 300; vs 这只是一个非常简单的示例,当然在实际项目中可能会有所不同。 这有关系吗?你肯定是在微观优化。在出现明显的性能瓶颈之前,我不会担心这个问题,您已经将问题缩小到使用多个变量与具有属性的对象 从逻辑上讲,使用对象方法需要创建三个变量,一个用于对象,一个用于对象上的每个属性,而另一个仅用于声明变量。因

这只是一个简单的性能问题,帮助我理解javascript引擎。 为此,我想知道什么更快:为某些值声明多个变量,或者使用一个包含多个值的对象

例如:

var x = 15;
var y = 300;
vs

这只是一个非常简单的示例,当然在实际项目中可能会有所不同。
这有关系吗?

你肯定是在微观优化。在出现明显的性能瓶颈之前,我不会担心这个问题,您已经将问题缩小到使用多个变量与具有属性的对象

从逻辑上讲,使用对象方法需要创建三个变量,一个用于对象,一个用于对象上的每个属性,而另一个仅用于声明变量。因此,拥有对象将具有更高的内存方法。但是,将对象传递给方法可能比将n>1个变量传递给方法更有效,因为您只需要复制1个值(javascript是按值传递的)。这也意味着要跟踪对象的词汇范围;i、 将更少的东西传递给方法将使用更少的内存


然而,我怀疑性能差异甚至可以通过任何剖析器来量化。

这个问题的完整答案将非常长。所以我只想解释几件事。首先,也许是最重要的事实,即使您使用
var
声明变量,这也取决于您在何处执行该操作。在全局范围内,您还可以隐式地在对象中写入该变量,大多数浏览器称之为
window
。比如说

// global scope
var x = 15;

console.log( window.x ); // 15
如果我们在函数的上下文中做同样的事情,事情就会改变。在函数的上下文中,我们将把变量名写入其名为“Activation Object”的函数中。也就是说,js引擎为您处理的内部对象。所有形式参数、函数声明和变量都存储在那里

现在回答您的实际问题:在函数的上下文中,使用
var
声明变量总是最快的。如果我们处于全球环境中,这也不一定是真的。全局对象非常巨大,访问其中的任何内容都不太快

如果我们在一个对象中存储东西,其速度仍然非常快,但不如
var
声明的变量快。尤其是访问时间确实增加了。但尽管如此,我们这里讨论的是微秒和纳秒(在现代浏览器实现中)。旧式浏览器,尤其是IE6+7,在访问对象属性时会有巨大的性能损失

如果你真的对这样的东西感兴趣,我向你推荐尼古拉斯·C·扎卡斯的《高性能Javascript》。他测量了许多不同的技术来为您访问和存储ECMAscript中的数据

同样,在现代浏览器中,
var
声明的对象查找和变量的性能差异几乎无法测量。像FF3或IE6这样的老式浏览器确实在对象查找/访问方面表现出了基本的缓慢性能。

理论或诸如“你在……嗯……做什么,老兄?”之类的问题当然可以作为答案出现在这里。但我认为这不是一个好办法

我刚刚创建了两个测试台:


  • 针对全球范围的特定
  • 例如,它表明,2017年7月,在基于Chrome的浏览器(VivaldiOpera谷歌Chrome和其他浏览器)中,为了实现最大性能,最好使用var。它读取值的速度快25%,写入值的速度快10%

    Node.js下,结果大致相同-因为相同的js引擎

    OperaPresto(12.18)中,测试结果的百分比与基于chromium的浏览器中类似

    在(现代版)火狐中,还有其他奇怪的画面。读取全局范围变量与读取对象属性大致相同,并且写入全局范围变量的速度明显慢于写入obj.prop(大约慢两倍)。它看起来像一只虫子

    对于在IE/Edge下进行的测试,欢迎使用


  • 正常情况下,对于函数内局部范围
  • 在基于Chromium的浏览器和Mozilla Firefox中,根据对象属性访问,您可以看到简单var性能的巨大优势。局部简单变量比处理对象属性快几倍(!)


    所以

    如果需要最大化某些关键JavaScript代码性能:

    • 在浏览器中-您可以强制对多个浏览器进行不同的优化。我不推荐!或者,您可以选择一些“最喜欢的”浏览器,为其优化代码,而不查看其他浏览器中的冻结情况。不是很好,但这是方法

    • 在浏览器中,再次-您真的需要以这种方式进行优化吗?您的算法/代码逻辑可能有问题

    • highloadNode.js模块(或其他高负载计算程序)中,尽量减少对象“点”,同时尽量减少对课程质量/可读性的损害-使用
      var

    任何情况下的安全优化技巧-当您对
    obj.subobj.*
    有太多操作时,您可以执行
    var subobj=obj.subobj并使用
    subobj.*
    进行操作。这可以提高可读性


    在任何情况下,想想你需要做什么,做什么,让你的高负载代码成为现实。

    foo\u bar
    总是比每个现代浏览器(IE11+/Edge和任何版本的Chrome、FireFox和Safari)和NodeJS中的
    foo.bar
    更快,只要你认为性能是整体的(我建议你应该这样做)。经过数百万次紧循环迭代后,
    foo.bar
    // global scope
    var x = 15;
    
    console.log( window.x ); // 15