JavaScript的声明性能问题

unj*_*nj2 6 javascript performance

你能帮我确定一下这些陈述的性能差异吗?你会用哪一个?

  1. 使用创建一个新的数组

     - var new_list = new Array();  or
     - var new_list = []
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用附加元素

    • 推( 'a')的
    • new_list [I]; (如果我知道长度)
  3. 三元运算符或if(){} else(){}

  4. 试图制作isodd函数,它更快
    (!(is_even))或(x%2!= 0)

  5. foreach或正常迭代

多一个

  1. a = b = 3; 或b = 3; A = B;

[编辑:我正在制作数学图书馆.所以任何表演黑客讨论也欢迎:)]

谢谢你的帮助.

Dra*_*cir 5

我一直认为,因为(x&1)是按位运算,它将是检查偶数/奇数的最快方法,而不是检查数字的剩余部分.


oll*_*iej 4

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

Anyhoo,只是看看快速的js 引擎(例如 Nitro、TraceMonkey 和 V8)

  1. [ ]将比new Array--new Array变成以下逻辑更快

    1. cons= 查找属性“Array”,如果找不到,则抛出异常
    2. 检查是否cons可以用作构造函数,如果不能:抛出异常
    3. thisVal=运行时直接创建一个新对象
    4. res= 调用的结果作为 -- 的值cons传递,这需要逻辑来区分 JS 函数和标准运行时函数(假设标准运行时函数没有在 JS 中实现,这是正常情况)。在本例中是一个本机构造函数,它将创建并返回一个新的运行时数组对象。thisValthisArray
    5. 如果res未定义或为 null,则最终结果为,thisVal否则最终结果为res。在调用的情况下,Array新的数组对象将被返回并被thisVal丢弃

    [ ]只是告诉 JS 引擎立即直接创建一个新的运行时数组对象,没有额外的逻辑。这意味着new Array有大量额外的(不是很便宜)逻辑,并执行额外不必要的对象分配。

  2. newlist[newlist.length] = ...速度更快(尤其是如果 newlist 不是稀疏数组),但推送对于我来说已经很常见了,我期望引擎开发人员投入相当多的精力来提高性能,这样这可能会及时改变。

  3. 如果你有一个足够紧的循环,那么三元运算符可能会稍微获胜,但可以说这是a = b ? c : dvs的简单情况下的引擎缺陷if (b) a = c; else a = d

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

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