質問編集履歴

4

再々トライ

2018/04/09 00:40

投稿

murabito
murabito

スコア108

test CHANGED
File without changes
test CHANGED
@@ -160,7 +160,7 @@
160
160
 
161
161
 
162
162
 
163
- # 再トライ
163
+ # 再トライ
164
164
 
165
165
  miyabi-sunさんからの回答を参考に再トライしてみました。
166
166
 
@@ -307,3 +307,183 @@
307
307
  //パターン4: 32951.688ms
308
308
 
309
309
  ```
310
+
311
+
312
+
313
+
314
+
315
+ # ★再々トライ
316
+
317
+ 最後に、miyabi-sunの指摘通り、console.logをprocess.stdout.writeに変えて実行してみました。
318
+
319
+ また、今回はforEachに渡す関数を匿名関数ではなく、事前に変数に代入してforEachに渡し実行するパターン5を追加しました。
320
+
321
+
322
+
323
+ ## パターン1
324
+
325
+ 配列に値を入れてメモリ確保 & for文内で配列参照せずにログ出力
326
+
327
+
328
+
329
+ ```
330
+
331
+ 'use strict';
332
+
333
+
334
+
335
+ var numbers = Array.from({length: 1000000}, (v, k) => k);
336
+
337
+ var max = numbers.length;
338
+
339
+
340
+
341
+ console.time('パターン1');
342
+
343
+ for (let i = 0; i < max; i = (i+1)|0) {
344
+
345
+ process.stdout.write(`${i}\n`);
346
+
347
+ }
348
+
349
+ console.timeEnd('パターン1');
350
+
351
+
352
+
353
+ //パターン1: 32088.090ms
354
+
355
+ ```
356
+
357
+
358
+
359
+
360
+
361
+ # パターン2
362
+
363
+ 配列に値を入れてメモリ確保 & for文内で配列参照して配列内の値をログ出力
364
+
365
+
366
+
367
+ ```
368
+
369
+ 'use strict';
370
+
371
+
372
+
373
+ var numbers = Array.from({length: 1000000}, (v, k) => k);
374
+
375
+ var max = numbers.length;
376
+
377
+
378
+
379
+ console.time('パターン2');
380
+
381
+ for (let i = 0; i < max; i = (i+1)|0) {
382
+
383
+ process.stdout.write(`${numbers[i]}\n`);
384
+
385
+ }
386
+
387
+ console.timeEnd('パターン2');
388
+
389
+
390
+
391
+ //パターン2': 32415.275ms
392
+
393
+ ```
394
+
395
+
396
+
397
+
398
+
399
+ # パターン3
400
+
401
+ 配列に値を入れてメモリ確保 & forEachで配列内の値をログ出力
402
+
403
+
404
+
405
+ ```
406
+
407
+ 'use strict';
408
+
409
+
410
+
411
+ var numbers = Array.from({length: 1000000}, (v, k) => k);
412
+
413
+ var max = numbers.length;
414
+
415
+
416
+
417
+ console.time('パターン3');
418
+
419
+ numbers.forEach((v) => process.stdout.write(`${v}\n`));
420
+
421
+ console.timeEnd('パターン3');
422
+
423
+
424
+
425
+ //パターン3': 31955.411ms
426
+
427
+ ```
428
+
429
+
430
+
431
+ # パターン4
432
+
433
+ 配列使わない & for文内でログ出力
434
+
435
+ ```
436
+
437
+ 'use strict';
438
+
439
+ var max = 1000000;
440
+
441
+
442
+
443
+ console.time('パターン4');
444
+
445
+ for (var i = 0; i < max; i = (i+1)|0) {
446
+
447
+ process.stdout.write(`${i}\n`);
448
+
449
+ }
450
+
451
+ console.timeEnd('パターン4');
452
+
453
+
454
+
455
+ //パターン4: 32404.780ms
456
+
457
+ ```
458
+
459
+
460
+
461
+ # パターン5
462
+
463
+ 配列に値を入れてメモリ確保 & forEachで配列内の値をログ出力(事前に関数を変数に代入してforEachに渡す)
464
+
465
+ ```
466
+
467
+ 'use strict';
468
+
469
+
470
+
471
+ var numbers = Array.from({length: 1000000}, (v, k) => k);
472
+
473
+ var max = numbers.length;
474
+
475
+
476
+
477
+ console.time('パターン5');
478
+
479
+ const log = (v) => process.stdout.write(`${v}\n`);
480
+
481
+ numbers.forEach(log);
482
+
483
+ console.timeEnd('パターン5');
484
+
485
+
486
+
487
+ //パターン5': 32368.805ms
488
+
489
+ ```

3

再トライ

2018/04/09 00:40

投稿

murabito
murabito

スコア108

test CHANGED
File without changes
test CHANGED
@@ -157,3 +157,153 @@
157
157
  パターン4: 32935.210ms
158
158
 
159
159
  ```
160
+
161
+
162
+
163
+ # 再トライ
164
+
165
+ miyabi-sunさんからの回答を参考に再トライしてみました。
166
+
167
+ ※ console.logはそのままで再トライしてしまいました。
168
+
169
+
170
+
171
+ 結果的に実行する度にどれが早いか遅いかが誤差レベルで変わってしまうので、for文がforEachより早いというのは分かりませんでした。
172
+
173
+
174
+
175
+ ## パターン1
176
+
177
+ 配列に値を入れてメモリ確保 & for文内で配列参照せずにログ出力
178
+
179
+
180
+
181
+ ```
182
+
183
+ 'use strict';
184
+
185
+
186
+
187
+ var numbers = Array.from({length: 1000000}, (v, k) => k);
188
+
189
+ var max = numbers.length;
190
+
191
+
192
+
193
+ console.time('パターン1');
194
+
195
+ for (let i = 0; i < max; i = (i+1)|0) {
196
+
197
+ console.log(i);
198
+
199
+ }
200
+
201
+ console.timeEnd('パターン1');
202
+
203
+
204
+
205
+ //パターン1: 32958.586ms
206
+
207
+ ```
208
+
209
+
210
+
211
+
212
+
213
+ # パターン2
214
+
215
+ 配列に値を入れてメモリ確保 & for文内で配列参照して配列内の値をログ出力
216
+
217
+
218
+
219
+ ```
220
+
221
+ 'use strict';
222
+
223
+
224
+
225
+ var numbers = Array.from({length: 1000000}, (v, k) => k);
226
+
227
+ var max = numbers.length;
228
+
229
+
230
+
231
+ console.time('パターン2');
232
+
233
+ for (let i = 0; i < max; i = (i+1)|0) {
234
+
235
+ console.log(numbers[i]);
236
+
237
+ }
238
+
239
+ console.timeEnd('パターン2');
240
+
241
+
242
+
243
+ //パターン2': 32869.883ms
244
+
245
+ ```
246
+
247
+
248
+
249
+
250
+
251
+ # パターン3
252
+
253
+ 配列に値を入れてメモリ確保 & forEachで配列内の値をログ出力
254
+
255
+
256
+
257
+ ```
258
+
259
+ 'use strict';
260
+
261
+
262
+
263
+ var numbers = Array.from({length: 1000000}, (v, k) => k);
264
+
265
+ var max = numbers.length;
266
+
267
+
268
+
269
+ console.time('パターン3');
270
+
271
+ numbers.forEach((v) => console.log(v));
272
+
273
+ console.timeEnd('パターン3');
274
+
275
+
276
+
277
+ //パターン3': 32855.013ms
278
+
279
+ ```
280
+
281
+
282
+
283
+ # パターン4
284
+
285
+ 配列使わない & for文内でログ出力
286
+
287
+ ```
288
+
289
+ 'use strict';
290
+
291
+ var max = 1000000;
292
+
293
+
294
+
295
+ console.time('パターン4');
296
+
297
+ for (var i = 0; i < max; i = (i+1)|0) {
298
+
299
+ console.log(i);
300
+
301
+ }
302
+
303
+ console.timeEnd('パターン4');
304
+
305
+
306
+
307
+ //パターン4: 32951.688ms
308
+
309
+ ```

2

説明追記

2018/04/09 00:22

投稿

murabito
murabito

スコア108

test CHANGED
File without changes
test CHANGED
@@ -19,6 +19,10 @@
19
19
 
20
20
 
21
21
  # パターン1
22
+
23
+ 配列に値を入れてメモリ確保 & for文内で配列参照せずにログ出力
24
+
25
+
22
26
 
23
27
  ```ここに言語を入力
24
28
 
@@ -51,6 +55,10 @@
51
55
 
52
56
 
53
57
  # パターン2
58
+
59
+ 配列に値を入れてメモリ確保 & for文内で配列参照して配列内の値をログ出力
60
+
61
+
54
62
 
55
63
  ```ここに言語を入力
56
64
 
@@ -86,6 +94,10 @@
86
94
 
87
95
  # パターン3
88
96
 
97
+ 配列に値を入れてメモリ確保 & forEachで配列内の値をログ出力
98
+
99
+
100
+
89
101
  ```ここに言語を入力
90
102
 
91
103
  'use strict';
@@ -118,6 +130,10 @@
118
130
 
119
131
  # パターン4
120
132
 
133
+ 配列使わない & for文内でログ出力
134
+
135
+
136
+
121
137
  ```ここに言語を入力
122
138
 
123
139
  'use strict';

1

for文が最速ではなかったのですか?

2018/04/08 21:56

投稿

murabito
murabito

スコア108

test CHANGED
File without changes
test CHANGED
@@ -3,6 +3,10 @@
3
3
 
4
4
 
5
5
  しかし、結果は誤差レベルであったり、むしろ、forEachの方がforよりも早い場合が実行する時によっては、あったりなかったりでした。
6
+
7
+
8
+
9
+ **for文が最速ではなかったのですか?**
6
10
 
7
11
 
8
12