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

質問編集履歴

4

再々トライ

2018/04/09 00:40

投稿

murabito
murabito

スコア108

title CHANGED
File without changes
body CHANGED
@@ -79,7 +79,7 @@
79
79
  パターン4: 32935.210ms
80
80
  ```
81
81
 
82
- # 再トライ
82
+ # 再トライ
83
83
  miyabi-sunさんからの回答を参考に再トライしてみました。
84
84
  ※ console.logはそのままで再トライしてしまいました。
85
85
 
@@ -152,4 +152,94 @@
152
152
  console.timeEnd('パターン4');
153
153
 
154
154
  //パターン4: 32951.688ms
155
+ ```
156
+
157
+
158
+ # ★再々トライ
159
+ 最後に、miyabi-sunの指摘通り、console.logをprocess.stdout.writeに変えて実行してみました。
160
+ また、今回はforEachに渡す関数を匿名関数ではなく、事前に変数に代入してforEachに渡し実行するパターン5を追加しました。
161
+
162
+ ## パターン1
163
+ 配列に値を入れてメモリ確保 & for文内で配列参照せずにログ出力
164
+
165
+ ```
166
+ 'use strict';
167
+
168
+ var numbers = Array.from({length: 1000000}, (v, k) => k);
169
+ var max = numbers.length;
170
+
171
+ console.time('パターン1');
172
+ for (let i = 0; i < max; i = (i+1)|0) {
173
+ process.stdout.write(`${i}\n`);
174
+ }
175
+ console.timeEnd('パターン1');
176
+
177
+ //パターン1: 32088.090ms
178
+ ```
179
+
180
+
181
+ # パターン2
182
+ 配列に値を入れてメモリ確保 & for文内で配列参照して配列内の値をログ出力
183
+
184
+ ```
185
+ 'use strict';
186
+
187
+ var numbers = Array.from({length: 1000000}, (v, k) => k);
188
+ var max = numbers.length;
189
+
190
+ console.time('パターン2');
191
+ for (let i = 0; i < max; i = (i+1)|0) {
192
+ process.stdout.write(`${numbers[i]}\n`);
193
+ }
194
+ console.timeEnd('パターン2');
195
+
196
+ //パターン2': 32415.275ms
197
+ ```
198
+
199
+
200
+ # パターン3
201
+ 配列に値を入れてメモリ確保 & forEachで配列内の値をログ出力
202
+
203
+ ```
204
+ 'use strict';
205
+
206
+ var numbers = Array.from({length: 1000000}, (v, k) => k);
207
+ var max = numbers.length;
208
+
209
+ console.time('パターン3');
210
+ numbers.forEach((v) => process.stdout.write(`${v}\n`));
211
+ console.timeEnd('パターン3');
212
+
213
+ //パターン3': 31955.411ms
214
+ ```
215
+
216
+ # パターン4
217
+ 配列使わない & for文内でログ出力
218
+ ```
219
+ 'use strict';
220
+ var max = 1000000;
221
+
222
+ console.time('パターン4');
223
+ for (var i = 0; i < max; i = (i+1)|0) {
224
+ process.stdout.write(`${i}\n`);
225
+ }
226
+ console.timeEnd('パターン4');
227
+
228
+ //パターン4: 32404.780ms
229
+ ```
230
+
231
+ # パターン5
232
+ 配列に値を入れてメモリ確保 & forEachで配列内の値をログ出力(事前に関数を変数に代入してforEachに渡す)
233
+ ```
234
+ 'use strict';
235
+
236
+ var numbers = Array.from({length: 1000000}, (v, k) => k);
237
+ var max = numbers.length;
238
+
239
+ console.time('パターン5');
240
+ const log = (v) => process.stdout.write(`${v}\n`);
241
+ numbers.forEach(log);
242
+ console.timeEnd('パターン5');
243
+
244
+ //パターン5': 32368.805ms
155
245
  ```

3

再トライ

2018/04/09 00:40

投稿

murabito
murabito

スコア108

title CHANGED
File without changes
body CHANGED
@@ -77,4 +77,79 @@
77
77
  console.timeEnd('パターン4');
78
78
 
79
79
  パターン4: 32935.210ms
80
+ ```
81
+
82
+ # 再トライ
83
+ miyabi-sunさんからの回答を参考に再トライしてみました。
84
+ ※ console.logはそのままで再トライしてしまいました。
85
+
86
+ 結果的に実行する度にどれが早いか遅いかが誤差レベルで変わってしまうので、for文がforEachより早いというのは分かりませんでした。
87
+
88
+ ## パターン1
89
+ 配列に値を入れてメモリ確保 & for文内で配列参照せずにログ出力
90
+
91
+ ```
92
+ 'use strict';
93
+
94
+ var numbers = Array.from({length: 1000000}, (v, k) => k);
95
+ var max = numbers.length;
96
+
97
+ console.time('パターン1');
98
+ for (let i = 0; i < max; i = (i+1)|0) {
99
+ console.log(i);
100
+ }
101
+ console.timeEnd('パターン1');
102
+
103
+ //パターン1: 32958.586ms
104
+ ```
105
+
106
+
107
+ # パターン2
108
+ 配列に値を入れてメモリ確保 & for文内で配列参照して配列内の値をログ出力
109
+
110
+ ```
111
+ 'use strict';
112
+
113
+ var numbers = Array.from({length: 1000000}, (v, k) => k);
114
+ var max = numbers.length;
115
+
116
+ console.time('パターン2');
117
+ for (let i = 0; i < max; i = (i+1)|0) {
118
+ console.log(numbers[i]);
119
+ }
120
+ console.timeEnd('パターン2');
121
+
122
+ //パターン2': 32869.883ms
123
+ ```
124
+
125
+
126
+ # パターン3
127
+ 配列に値を入れてメモリ確保 & forEachで配列内の値をログ出力
128
+
129
+ ```
130
+ 'use strict';
131
+
132
+ var numbers = Array.from({length: 1000000}, (v, k) => k);
133
+ var max = numbers.length;
134
+
135
+ console.time('パターン3');
136
+ numbers.forEach((v) => console.log(v));
137
+ console.timeEnd('パターン3');
138
+
139
+ //パターン3': 32855.013ms
140
+ ```
141
+
142
+ # パターン4
143
+ 配列使わない & for文内でログ出力
144
+ ```
145
+ 'use strict';
146
+ var max = 1000000;
147
+
148
+ console.time('パターン4');
149
+ for (var i = 0; i < max; i = (i+1)|0) {
150
+ console.log(i);
151
+ }
152
+ console.timeEnd('パターン4');
153
+
154
+ //パターン4: 32951.688ms
80
155
  ```

2

説明追記

2018/04/09 00:22

投稿

murabito
murabito

スコア108

title CHANGED
File without changes
body CHANGED
@@ -9,6 +9,8 @@
9
9
  ターミナルのnode.js環境で実行しました。
10
10
 
11
11
  # パターン1
12
+ 配列に値を入れてメモリ確保 & for文内で配列参照せずにログ出力
13
+
12
14
  ```ここに言語を入力
13
15
  'use strict';
14
16
 
@@ -25,6 +27,8 @@
25
27
  ```
26
28
 
27
29
  # パターン2
30
+ 配列に値を入れてメモリ確保 & for文内で配列参照して配列内の値をログ出力
31
+
28
32
  ```ここに言語を入力
29
33
  'use strict';
30
34
 
@@ -42,6 +46,8 @@
42
46
 
43
47
 
44
48
  # パターン3
49
+ 配列に値を入れてメモリ確保 & forEachで配列内の値をログ出力
50
+
45
51
  ```ここに言語を入力
46
52
  'use strict';
47
53
 
@@ -58,6 +64,8 @@
58
64
 
59
65
 
60
66
  # パターン4
67
+ 配列使わない & for文内でログ出力
68
+
61
69
  ```ここに言語を入力
62
70
  'use strict';
63
71
  var max = 1000000;

1

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

2018/04/08 21:56

投稿

murabito
murabito

スコア108

title CHANGED
File without changes
body CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  しかし、結果は誤差レベルであったり、むしろ、forEachの方がforよりも早い場合が実行する時によっては、あったりなかったりでした。
4
4
 
5
+ **for文が最速ではなかったのですか?**
6
+
5
7
  僕の検証方法がおかしいのでしょうか?それとも、こういうものですか?
6
8
 
7
9
  ターミナルのnode.js環境で実行しました。