javascript var语句和性能

javascript var statement and performance

本文关键字:性能 语句 var javascript      更新时间:2023-09-26

选项1:无赋值的多变量

function MyFunction() {
  var a = null;
  var b = null;
  ....
  var z = null;
  a = SomeValue;
  b = SomeValue2;
  ....
}

选项2:一个var语句,无赋值

function MyFunction() {
  var a, b ..., z;
  a = SomeValue;
  b = SomeValue2;
  ....
}

选项3:带有赋值的多个var语句

function MyFunction() {
  var a = SomeValue;
  var b = SomeValue2;
  ....
  var z = SomeValue26;
}

使用特定选项是否有任何性能优势?两个基元类型赋值AND对象引用赋值都是这样吗?

感谢您的意见。

"过早优化是万恶"

我认为这些选项中的任何一个都不会有任何显著的性能变化
(IMO)第三个选项是最可读的选项,最接近动态内存分配,如C#等。但这是我的浅见,选择你最喜欢的

如果真的让你感到困扰,并且你无法在没有答案的情况下入睡,请使用jsPerf进行测试。


@乍得做了一个jsPerf,所以你今晚可以睡得很好。。。

要了解性能,首先应该了解吊装。让我们取以下代码:

var x = 1;
function bar(val) {
    var returnVal = val * 2;
    return returnVal;
}
function foo(val) {
    var returnVal = 10;
    returnVal *= bar(val);
    return returnVal;
}
var y = foo(x);
console.log(y); // 20

提升基本上意味着JavaScript解释器将把变量声明"提升"到其作用域的顶部。让这个例子看起来更像这样:

var x, y;
x = 1;
function bar(val) {
    var returnVal;
    returnVal = val * 2;
    return returnVal;
}
function foo(val) {
    var returnVal;
    returnVal = 10;
    returnVal *= bar(val);
    return returnVal;
}
y = foo(x);
console.log(y); // 20

所以,在你给出的例子中,选项2和3基本上会做同样的事情。因为解释器会将这些声明移到顶部。在这一点上,这是一个偏好的决定。很多人避免做类似var x, y, z;的事情,说这很危险。I、 就我个人而言,这样做吧。无论我在哪个范围内,我都会在顶部声明所有变量,然后在下面使用它们。但无论哪种方式都有效。

现在,你的第一个例子是效率最低的。吊装后,它将看起来像这样:

function MyFunction() {
    var a, b, ... z;
    a = null;
    b = null;
    ...
    z = null;
    a = someValue;
    b = someValue2;
    ...
    z = someValueN;
}

它基本上导致设置变量两次。

在Chrome中,执行时间是相同的。

这里唯一真正需要考虑的是优化网络传输

考虑var a=1;var b=2;...;var z=9;var a=1,b=2,...,z=9;

如果在每个标识符前面放一个;var ,则为5个字节(假设为单字节字符编码),而,为1个字节。因此,通过声明26个变量,您可以通过一次写入var 并用逗号列出标识符来节省100个字节。

诚然,这并不是一个巨大的节省,但在网络上推送比特时,每个字节都有帮助。这并不需要太担心,但如果您发现自己在同一个区域中声明了几个变量,那么使用变量声明列表是从JS文件中删除几个字节的简单方法。

这似乎是过早的优化,是万恶之源。

它将被执行多少次?这将消耗整个程序的哪一部分?

我将用几个问题来回答您关于性能的问题:

  1. 你注意到性能问题了吗
  2. 您是否确定您的var语句是瓶颈
  3. 你测试过每个版本吗

我假设所有这些问题的答案都是

这些选项都不应该有任何显著的区别,尽管唯一可以确定的方法是运行它们并进行测试。JavaScript是一种异步客户端语言,这意味着你必须运行大量的代码才能使var语句成为任何类型的瓶颈


最后,如果您正在决定使用哪个版本,我建议您使用一个没有赋值的var语句:

function () {
    var a,
        b,
        c,
        foo,
        bar,
        fizz,
        buzz;
    a = 1;
    ...
    b = 3;
}

原因是,由于可变提升,代码将以这种方式执行。然后,我可以将initialize语句移动到第一次使用变量的位置,例如在for循环中:

function foo(arr) {
    var i,
        l;
    ...
    for (i = 0, l = arr.length; i < l; i++) {
        doStuff(arr[i]);
    }
    ...
}

它们基本上都做相同的事情:声明一个变量并最终定义它(为它赋值)。在整个示例中,您唯一要更改的是发生这种情况的顺序,甚至这取决于编译JavaScript的浏览器——有些浏览器可能会执行其他浏览器没有执行的优化。

不过,你应该遵循一些风格准则,这个答案很好地解释了这些准则。请记住,这个答案与技术无关,可能根本不适用于JavaScript。

尽可能远离选项1,不需要进行两次赋值。

甚至在for循环或其他复合语句/块中声明的变量也将在其包含块之外可用。

你也可以做:

function MyFunction() {
  var a = SomeValue, b = SomeVavlue2;
}