你们可以帮我确定每种产品的性能差异吗? 声明?你会用哪一个?
使用
制作新数组 - var new_list = new Array(); or
- var new_list = []
使用
添加元素三元运算符或if(){} else(){}
尝试制作isodd功能,这是更快的 (!(is_even))或(x%2!= 0)
foreach或正常迭代
[编辑:我正在制作数学图书馆。所以任何表演黑客讨论也欢迎:)]
感谢您的帮助。
答案 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)
[ ]
将比new Array
更快 - new Array
变成以下逻辑
cons
=查找属性“数组”,如果找不到,则抛出异常cons
是否可以用作构造函数,否则:抛出异常thisVal
=运行时直接创建新对象res
=调用cons
传递thisVal
作为this
的值的结果 - 这需要逻辑来区分JS函数和标准运行时函数(假设标准运行时函数)没有在JS中实现,这是正常的情况)。在这种情况下,Array
是一个本机构造函数,它将创建并返回一个新的运行时数组对象。res
未定义或为null,则最终结果为thisVal
,否则最终结果为res
。在调用Array
的情况下,将返回一个新的数组对象,并且thisVal
将被丢弃 [ ]
只是告诉JS引擎直接创建一个新的运行时数组对象而没有其他逻辑。这意味着new Array
具有大量额外(非常便宜)的逻辑,并执行和额外的不必要的对象分配。
newlist[newlist.length] = ...
更快(特别是如果newlist不是稀疏数组),但推送对我来说足够普遍,我希望引擎开发人员能够付出相当大的努力来提高性能,所以这个可能及时改变。
如果你有一个足够紧的循环,三元运算符可能会有一个非常轻微的胜利,但可以说这是a = b ? c : d
vs if (b) a = c; else a = d
单独使用函数调用开销会使或多或少任何JS运算符的成本相形见绌,至少在理智的情况下(例如,您对数字而不是对象执行算术)
foreach
语法尚未标准化,但其最终效果将取决于大量细节;通常,JS语义会导致高效的语句效率降低 - 例如。 for (var i in array) ...
比for (var i = 0; i < array.length; i++) ...
慢得多,因为JS语义需要in
枚举来构建对象(包括原型链)上所有属性的列表,然后 检查以确保每个属性仍然在对象上,然后再通过循环发送它。哦,属性需要从整数(无论如何在数组的情况下)转换成字符串,这会花费时间和内存。
答案 3 :(得分:3)
编辑:在#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)