JavaScript';s声明性能问题

JavaScript';s声明性能问题,javascript,performance,Javascript,Performance,你们能帮我确定每一个的性能差异吗 声明?你会用哪一个 使用 - var new_list = new Array(); //or - var new_list = []; 使用 - push('a') - new_list[i]; (if i know the length) 三元运算符或if(){}else(){} 正在尝试使isodd函数更快 (! (is_even)) or (x%2!=0) forEach()或正常迭代 再来一次 a=b=3或b=3;a=b [编辑:我正

你们能帮我确定每一个的性能差异吗 声明?你会用哪一个

  • 使用

    - var new_list = new Array();  //or
    - var new_list = [];
    
  • 使用

    - push('a')
    - new_list[i]; (if i know the length)
    
  • 三元运算符或
    if(){}else(){}

  • 正在尝试使isodd函数更快

    (! (is_even)) or (x%2!=0)
    
  • forEach()
    或正常迭代

  • 再来一次

  • a=b=3
    b=3;a=b
  • [编辑:我正在制作一个数学库。因此,也欢迎任何性能黑客讨论:)]


    谢谢您的帮助。

    我建议您编写一个简单的脚本,如:

    for(var i = 0; i < 1000; i++){
      // Test your code here.
    }
    
    for(变量i=0;i<1000;i++){
    //在这里测试代码。
    }
    
    您可以通过这种方式对任何内容进行基准测试,可能会在
    for
    语句之前和之后添加计时函数,以便更加准确

    当然,您需要根据操作的性质调整上限(本例中为1000),有些需要更多的迭代,有些需要更少的迭代

  • 两者都是本机构造函数,可能没有区别
  • 推送速度更快,它直接映射到本机,其中as[]是可计算的
  • 可能差别不大,但从技术上讲,他们做的事情并不相同,所以这不是苹果对苹果的问题
  • x%2,跳过相对较慢的函数调用
  • 我听说,虽然目前无法找到链接,但迭代比foreach更快,这让我感到惊讶
  • 编辑:在#5上,我认为原因与foreach的顺序是向前的,这要求递增者向前计数,而for循环在向后运行时的速度是无限快的:

    for(var i=a.length;i>-1;i--) {
        // do whatever
    }
    
    上述速度略快于:

    for(var i=0;i<a.length;i++) {
        // do whatever
    }
    

    用于(var i=0;i正如其他海报所建议的那样,我认为做一些粗略的基准测试是你最好的选择……然而,我也要指出,你可能会从不同的浏览器中得到非常不同的结果,因为我相信你问的大多数问题都归结为语言结构的特定内部实现,而不是语言本身。

    我一直认为,由于(x&1)是一种按位操作,它将是检查偶数/奇数的最快方法,而不是检查数字的其余部分。

    本页说推送速度较慢。

    所有浏览器的性能特征(特别是在单个库函数的级别上)可能会有很大差异,因此很难对这些问题给出有意义的答案

    总之,看看快速js引擎(Nitro、TraceMonkey和V8)

  • []
    将比
    新阵列
    -
    新阵列
    转换为以下逻辑更快

  • cons
    =查找属性“Array”,如果找不到,则引发异常
  • 检查
    cons
    是否可以用作构造函数,如果不能:抛出异常
  • thisVal
    =运行时直接创建一个新对象
  • res
    =调用
    cons
    的结果将
    thisVal
    传递为
    this
    的值——这需要逻辑来区分JS函数和标准运行时函数(假设标准运行时函数没有在JS中实现,这是正常情况)。在本例中,
    Array
    是一个本机构造函数,它将创建并返回一个新的运行时数组对象
  • 如果
    res
    未定义或为空,则最终结果为
    thisVal
    ,否则最终结果为
    res
    。在调用
    Array
    的情况下,将返回一个新的数组对象,并丢弃
    thisVal
  • []
    只是告诉JS引擎立即直接创建一个新的运行时数组对象,而不需要额外的逻辑。这意味着
    新数组
    有大量额外的(不是很便宜的)逻辑,并执行额外的和不必要的对象分配

  • newlist[newlist.length]=…
    更快(特别是在newlist不是稀疏数组的情况下),但是push对于我来说非常常见,我希望引擎开发人员投入相当多的精力来提高性能,以便及时改变

  • 如果你有一个足够紧密的循环,三元操作符可能会有一个非常微小的胜利,但可以说这是一个引擎缺陷,在
    a=b?c:d
    vs
    If(b)a=c;else a=d

  • 仅函数调用开销就足以使任何JS操作符的成本相形见绌,至少在正常情况下是如此(例如,您正在对数字而不是对象执行算术)

  • foreach
    语法尚未标准化,但其最终性能将取决于大量细节;通常JS语义会导致看起来效率较低的语句——例如,
    for(vari in array).
    for(vari=0;i
    因为JS语义要求
  • 枚举中的
    建立对象(包括原型链)上所有属性的列表,然后检查以确保每个属性在通过循环发送之前仍在对象上。哦,属性需要从整数转换(无论如何在数组中)转换为字符串,这需要花费时间和内存


    我以前做过,我有一些技巧。首先,在多个浏览器中测试,因为它们有不同的JS引擎。其次,你需要1000多次迭代才能看到任何结果。第三,你必须在IE等浏览器上禁用脚本警告。此外,每个浏览器跟踪时间的方式也不同(错误地).比如,我听说有些情况下IE会忽略小于15毫秒的时间。我更喜欢使用'var myArray=[];',因为它更简单…你一定像这个javascript忍者。第5个是最令人震惊的。有吗