teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

比較まとめ

2017/08/22 14:40

投稿

think49
think49

スコア18194

answer CHANGED
@@ -77,4 +77,78 @@
77
77
  第一式はともかく、第二式+第三式が両方とも実行されるのは `for` 文にパフォーマンス上は不利に働きます。
78
78
  出来るだけ多くのブラウザで高速に動作させることを求めるならば、`while` 文の一択だと私は思います。
79
79
 
80
+ ### 比較まとめ
81
+
82
+ コードの最適化を進めた上で比較してみました。
83
+
84
+ ```JavaScript
85
+ var bench = new Array(10000000);
86
+ var sTime, fTime;
87
+
88
+ /**
89
+ * _.each
90
+ */
91
+ sTime = new Date();
92
+ var sqrt = Math.sqrt,
93
+ pow = Math.pow;
94
+ _.each(bench, function (value, index) {
95
+ bench[index] = sqrt(pow(12345) + pow(53142));
96
+ });
97
+ fTime = new Date();
98
+ console.log('_.each', fTime - sTime);
99
+
100
+ /**
101
+ * Array.prototype.forEach
102
+ */
103
+ sTime = new Date();
104
+ var sqrt = Math.sqrt,
105
+ pow = Math.pow;
106
+ bench.forEach(function (value, index, array) {
107
+ array[index] = sqrt(pow(12345) + pow(53142));
108
+ });
109
+ fTime = new Date();
110
+ console.log('Array.prototype.forEach', fTime - sTime);
111
+
112
+ /**
113
+ * for
114
+ */
115
+ sTime = new Date();
116
+ for (var i = 0, len = bench.length, sqrt = Math.sqrt, pow = Math.pow; i < len; i++) {
117
+ bench[i] = sqrt(pow(12345) + pow(53142));
118
+ }
119
+ fTime = new Date();
120
+ console.log('for', fTime - sTime);
121
+
122
+ /**
123
+ * while
124
+ */
125
+ sTime = new Date();
126
+ var i = bench.length,
127
+ sqrt = Math.sqrt,
128
+ pow = Math.pow;
129
+
130
+ while (i--) {
131
+ bench[i] = sqrt(pow(12345) + pow(53142));
132
+ }
133
+
134
+ fTime = new Date();
135
+ console.log('while', fTime - sTime);
136
+ ```
137
+
138
+ 私の環境では、次の結果となりました。
139
+
140
+ ```JavaScript
141
+ "_.each 899"
142
+ "Array.prototype.forEach 658"
143
+ "for 574"
144
+ "while 570"
145
+ ```
146
+
147
+ - ライブラリはネイティブ機能に勝てません。
148
+ - 繰り返し処理において、関数呼び出しは制御構文(while, for 等)よりも遅いです。
149
+
150
+ ### 更新履歴
151
+
152
+ - 2017/08/22 23:40 「比較まとめ」の節を追記
153
+
80
154
  Re: airulove さん