JavaScript的声明性能问题

时间:2009-04-14 02:39:24

标签: javascript performance

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

  1. 使用

    制作新数组
     - var new_list = new Array();  or
     - var new_list = []
    
  2. 使用

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

  4. 尝试制作isodd功能,这是更快的     (!(is_even))或(x%2!= 0)

  5. foreach或正常迭代

  6. 再来一次

    1. a = b = 3;或b = 3; A = B;
    2. [编辑:我正在制作数学图书馆。所以任何表演黑客讨论也欢迎:)]

      感谢您的帮助。

7 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

for(var i = 0; i < 1000; i++){
  // Test your code here.
}

您可以通过这种方式对任何想法进行基准测试,可能会在for语句之前和之后添加计时功能,以便更准确。

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

答案 2 :(得分:4)

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

Anyhoo,只是看着快速 js引擎(所以Nitro,TraceMonkey和V8)

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

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

    7. newlist[newlist.length] = ...更快(特别是如果newlist不是稀疏数组),但推送对我来说足够普遍,我希望引擎开发人员能够付出相当大的努力来提高性能,所以这个可能及时改变。

    8. 如果你有一个足够紧的循环,三元运算符可能会有一个非常轻微的胜利,但可以说这是a = b ? c : d vs if (b) a = c; else a = d

    9. 单独使用函数调用开销会使或多或少任何JS运算符的成本相形见绌,至少在理智的情况下(例如,您对数字而不是对象执行算术)

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

答案 3 :(得分:3)

  1. 两者都是本机构造函数,可能没什么区别。
  2. 推送更快,它直接映射到本机,其中[]是评估性的
  3. 可能差别不大,但从技术上讲,他们不会做同样的事情,所以不是苹果对苹果
  4. x%2,跳过相对较慢的函数调用
  5. 我听说,虽然目前找不到链接,但迭代速度比foreach快,这对我来说很惊讶。
  6. 编辑:在#5上,我相信原因与this有关,因为foreach是向前排序的,这需要递增器向前计数,而for循环在它们向后运行时是无限快的:

    for(var i=a.length;i>-1;i--) {
        // do whatever
    }
    

    上述情况略快于:

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

答案 4 :(得分:1)

正如其他海报所说,我认为做一些粗略的基准测试是你最好的选择...但是,我也注意到你可能会从不同的浏览器中得到非常不同的结果,因为我确定大多数问题你要问的是语言结构的具体内部实现,而不是语言本身。

答案 5 :(得分:1)

您可能对this question及其答案感兴趣

答案 6 :(得分:0)