8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

es5のforEachって高速なの?

Last updated at Posted at 2015-05-08

es5でいろいろ関数追加されたので、underscoreとかjqueryよりもこっちを使ったほうが高速なのかなとかれこれ一年ぐらいもやもやしていたので調べてみた。

検証してみた

検証コード

  var array = [];
  var i = 0;

  for (i;i<100000;i++){
    array.push("hoge"+i);
  }

forEach

  console.time("forEach");
  array.forEach(function(item){
    item = item + "aaa";
  });
  console.timeEnd("forEach");

_.each

  console.time("_each");
  _.each(array,function(item){
    item = item + "ccc";
  });
  console.timeEnd("_each");

for

  console.time("for");
  for (i;i<100000;i++){
    array[i] = array[i] + "bbb";
  }
  console.timeEnd("for")

検証環境

Chrome 42.0.2311.135 (64-bit)
CPU 2.7 GHz Intel Core i5
OS Mac OS X 10.10.2

forEach

28.434
20.039
39.702
20.401
27.185

avg 27.1522ms

_.each

_.each
25.686
18.825
22.195
20.494
18.763

avg 21.1926ms

for

0.007
0.008
0.008
0.01
0.008

avg 0.0082

forEachけっこう遅いですね。
underscoreのeachのほうがまだちょっと速いぐらい。

クロージャつくらないforがダントツで高速でした。
予想はしていましたがダントツすぎてびびりました。

追記

コメントで教えてもらいましたが
forEachが_.eachより遅いのはdeleteされた配列はスキップしてくれるからです。

_.eachやforの場合、中身があろうがなかろうが、
indexを参照します。

var arr = [1,2,3,4];
delete arr[2];

//1,2,4が出力
arr.forEach(function(v){console.log(v)});

用途に応じて使い分けるのがよさそうですね。

8
7
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?