在coffee脚本中初始化具有特定值0
的数组的最佳方法是什么。到目前为止我所做的事情-
[0..100].map -> 0
和
arr = []
arr.push(0) while arr.length isnt 100
如果个人觉得第一个会有一个糟糕的性能,第二个太冗长,破坏了咖啡脚本编程的魅力。
更新2:如果性能不是问题,那么我想这也是一个选择。
arr = new Array(10).join(0).split('')
更新2:如果联接通过number
,上述选项的性能将优于其他选项
更新3:在看到评论和答案中提到的几个JSPerf测试后,我尝试使用node.js自行执行这些测试代码-
size = 10000000;
key = 1
console.time('splits')
arr1= Array(size + 1).join(key).split('')
console.timeEnd('splits')
console.time('maps')
arr2 = [1..size].map -> key
console.timeEnd('maps')
console.time('loop')
arr3 = []
arr3.push(key) while arr3.length isnt size
console.timeEnd('loop')
console.time('for')
arr4 = (0 for n in [0...size])
console.timeEnd('for')
console.time('for-no-var')
arr5 = (0 for [0...size])
console.timeEnd('for-no-var')
### node- 0.10.15
splits: 162ms
maps: 1639ms
loop: 607ms
for: 659ms
###
有趣的是,拆分和加入所花费的时间要少得多。此外,如果我们真的关心性能,那么我们应该尝试初始化一个真正大的数组,而不是几百个数量级的数组。
如果你不想让任何迭代变量泄露到理解之外,还有arr = (0 for [1..100])
形式;)
我的投票转到arr = (0 for x in [0...100])
它清晰、简洁、CoffeeScript风格,并可编译成合理清晰的Javascript:
var arr, x;
arr = (function() {
var _i, _results;
_results = [];
for (x = _i = 0; _i < 100; x = ++_i) {
_results.push(0);
}
return _results;
})();
以下是问题/评论中提到的每个选项的性能比较
http://jsperf.com/array-initialization-in-coffeescript
我在Chrome 28 上
arr = []
arr.push(0) while arr.length isnt 100
是最快的
和
[0..100].map -> 0
是最慢的。
也就是说,最慢的一次大约是10万次操作/秒。由于初始化应该是一个相对不常见的操作,我认为可以肯定地说,这里的性能不如可读性重要。
就我个人而言,我发现推送版本和地图版本是最可读的,但这确实应该由你和其他将使用/阅读此代码的人做出决定。