在CoffeeScript中初始化数组的最聪明方法



在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万次操作/秒。由于初始化应该是一个相对不常见的操作,我认为可以肯定地说,这里的性能不如可读性重要。

就我个人而言,我发现推送版本和地图版本是最可读的,但这确实应该由你和其他将使用/阅读此代码的人做出决定。

最新更新