質問編集履歴

2

計測結果を追記

2016/03/25 11:36

投稿

flat
flat

スコア617

test CHANGED
File without changes
test CHANGED
@@ -16,6 +16,12 @@
16
16
 
17
17
  ちなみに、使用したブラウザはGoogle Chrome 49です。
18
18
 
19
+
20
+
21
+ **追記**
22
+
23
+ 一応計測結果をコードの方に追記
24
+
19
25
  ```HTML
20
26
 
21
27
  <!DOCTYPE html>
@@ -32,6 +38,16 @@
32
38
 
33
39
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
34
40
 
41
+ <style type="text/css">
42
+
43
+ .check {
44
+
45
+ color: red;
46
+
47
+ }
48
+
49
+ </style>
50
+
35
51
  <script type="text/javascript">
36
52
 
37
53
  ;( function () {
@@ -40,21 +56,49 @@
40
56
 
41
57
  function func(event) {
42
58
 
43
- var doc = event.target;
59
+ var doc = event.target;
60
+
61
+
62
+
63
+ console.time('get');
64
+
65
+
66
+
67
+ // getElementsByTagName = HTMLCollection
68
+
69
+ var elements = doc.getElementsByTagName('p');
70
+
71
+
72
+
73
+ // getElementsByClassName = HTMLCollection
44
74
 
45
75
  //var elements = doc.getElementsByClassName('element');
46
76
 
77
+
78
+
79
+ // querySelectorAll = NodeList
80
+
81
+ //var elements = doc.querySelectorAll('.element');
82
+
83
+
84
+
85
+ // Array
86
+
47
- var elements = Array.prototype.slice.call(doc.getElementsByClassName('element'));
87
+ //var elements = Array.prototype.slice.call(doc.getElementsByClassName('element'));
48
-
88
+
89
+
90
+
49
- // お手数ですがコメントアウトを切り替えてコンソールを確認してみてください
91
+ console.timeEnd('get');
50
-
92
+
93
+
94
+
51
- var l = elements.length;
95
+ var l = elements.length;
52
96
 
53
97
  var element;
54
98
 
55
99
 
56
100
 
57
- console.time('time');
101
+ console.time('for');
58
102
 
59
103
  for (var i = 0; i < l; i++) {
60
104
 
@@ -64,7 +108,7 @@
64
108
 
65
109
  }
66
110
 
67
- console.timeEnd('time');
111
+ console.timeEnd('for');
68
112
 
69
113
  }
70
114
 
@@ -72,6 +116,80 @@
72
116
 
73
117
  document.addEventListener('DOMContentLoaded', func, false);
74
118
 
119
+
120
+
121
+ /*
122
+
123
+ * 取得(処理時間が短い順)
124
+
125
+ *
126
+
127
+ * getElementsByTagName & getElementsByClassName
128
+
129
+ * 要素数1000: 約0.03ms
130
+
131
+ * 要素数10000: 約0.03ms
132
+
133
+ *
134
+
135
+ * querySelectorAll
136
+
137
+ * 要素数1000: 約0.1ms
138
+
139
+ * 要素数10000: 約0.4ms
140
+
141
+ *
142
+
143
+ * Array(Array.prototype.slice.call(HTMLCollection)で配列に変換)
144
+
145
+ * 要素数1000: 約2.5ms
146
+
147
+ * 要素数10000: 約7ms
148
+
149
+ * 要素の取得時間というよりは、ほぼ変換処理にかかる時間
150
+
151
+ */
152
+
153
+
154
+
155
+ /*
156
+
157
+ * forループ処理(処理時間が短い順)
158
+
159
+ *
160
+
161
+ * Array
162
+
163
+ * 要素数1000: 約0.8ms
164
+
165
+ * 要素数10000: 約9ms
166
+
167
+ *
168
+
169
+ * getElementsByTagName
170
+
171
+ * 要素数1000: 約2.5ms
172
+
173
+ * 要素数10000: 約12ms
174
+
175
+ *
176
+
177
+ * querySelectorAll
178
+
179
+ * 要素数1000: 約2.6ms
180
+
181
+ * 要素数10000: 約13ms
182
+
183
+ *
184
+
185
+ * getElementsByClassName
186
+
187
+ * 要素数1000: 約15ms
188
+
189
+ * 要素数10000: 約756ms
190
+
191
+ */
192
+
75
193
  }());
76
194
 
77
195
  </script>
@@ -82,6 +200,8 @@
82
200
 
83
201
  <div class="elements">
84
202
 
203
+ <!-- 100 element -->
204
+
85
205
  <p class="element">element</p>
86
206
 
87
207
  <p class="element">element</p>

1

計測内容の追記

2016/03/25 11:36

投稿

flat
flat

スコア617

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,291 @@
1
1
  NodeListやHTMLCollectionといったArray-Like ObjectをArray Objectに変換すると、ループ処理などの時に高速に処理できるという旨の情報を目にしたのですが、これは`getElementsBy~`などで取得したArray-Like Objectに対して「とりあえずやっておく」というおまじない的なレベルで利用できるものと見て良いのでしょうか?
2
2
 
3
3
  また、Array Objectにすることによる他のメリットやデメリットなどもあればお聞きしたいです。
4
+
5
+
6
+
7
+ **追記**
8
+
9
+ 実際に100個の要素を`getElementsByClassName`で取得してループさせ、`className`プロパティを使ってクラスを追加するという内容で処理時間を比較して計測したところ、2倍以上の処理時間を短縮を確認できました。
10
+
11
+ また、`element.className = element.className + ' check';`を削除するとその差がより大きくなり、少なくとも20倍の差が開きました。
12
+
13
+ この結果からすると、高速に処理できるという点は間違いないと見て良いのでしょうか。
14
+
15
+ それとも、この計測の仕方が適切ではないだけでしょうか?
16
+
17
+ ちなみに、使用したブラウザはGoogle Chrome 49です。
18
+
19
+ ```HTML
20
+
21
+ <!DOCTYPE html>
22
+
23
+ <html lang="ja">
24
+
25
+ <head>
26
+
27
+ <meta charset="utf-8">
28
+
29
+ <title>example</title>
30
+
31
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
32
+
33
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
34
+
35
+ <script type="text/javascript">
36
+
37
+ ;( function () {
38
+
39
+ 'use strict';
40
+
41
+ function func(event) {
42
+
43
+ var doc = event.target;
44
+
45
+ //var elements = doc.getElementsByClassName('element');
46
+
47
+ var elements = Array.prototype.slice.call(doc.getElementsByClassName('element'));
48
+
49
+ // お手数ですがコメントアウトを切り替えてコンソールを確認してみてください
50
+
51
+ var l = elements.length;
52
+
53
+ var element;
54
+
55
+
56
+
57
+ console.time('time');
58
+
59
+ for (var i = 0; i < l; i++) {
60
+
61
+ element = elements[i];
62
+
63
+ element.className = element.className + ' check';
64
+
65
+ }
66
+
67
+ console.timeEnd('time');
68
+
69
+ }
70
+
71
+
72
+
73
+ document.addEventListener('DOMContentLoaded', func, false);
74
+
75
+ }());
76
+
77
+ </script>
78
+
79
+ </head>
80
+
81
+ <body>
82
+
83
+ <div class="elements">
84
+
85
+ <p class="element">element</p>
86
+
87
+ <p class="element">element</p>
88
+
89
+ <p class="element">element</p>
90
+
91
+ <p class="element">element</p>
92
+
93
+ <p class="element">element</p>
94
+
95
+ <p class="element">element</p>
96
+
97
+ <p class="element">element</p>
98
+
99
+ <p class="element">element</p>
100
+
101
+ <p class="element">element</p>
102
+
103
+ <p class="element">element</p>
104
+
105
+ <p class="element">element</p>
106
+
107
+ <p class="element">element</p>
108
+
109
+ <p class="element">element</p>
110
+
111
+ <p class="element">element</p>
112
+
113
+ <p class="element">element</p>
114
+
115
+ <p class="element">element</p>
116
+
117
+ <p class="element">element</p>
118
+
119
+ <p class="element">element</p>
120
+
121
+ <p class="element">element</p>
122
+
123
+ <p class="element">element</p>
124
+
125
+ <p class="element">element</p>
126
+
127
+ <p class="element">element</p>
128
+
129
+ <p class="element">element</p>
130
+
131
+ <p class="element">element</p>
132
+
133
+ <p class="element">element</p>
134
+
135
+ <p class="element">element</p>
136
+
137
+ <p class="element">element</p>
138
+
139
+ <p class="element">element</p>
140
+
141
+ <p class="element">element</p>
142
+
143
+ <p class="element">element</p>
144
+
145
+ <p class="element">element</p>
146
+
147
+ <p class="element">element</p>
148
+
149
+ <p class="element">element</p>
150
+
151
+ <p class="element">element</p>
152
+
153
+ <p class="element">element</p>
154
+
155
+ <p class="element">element</p>
156
+
157
+ <p class="element">element</p>
158
+
159
+ <p class="element">element</p>
160
+
161
+ <p class="element">element</p>
162
+
163
+ <p class="element">element</p>
164
+
165
+ <p class="element">element</p>
166
+
167
+ <p class="element">element</p>
168
+
169
+ <p class="element">element</p>
170
+
171
+ <p class="element">element</p>
172
+
173
+ <p class="element">element</p>
174
+
175
+ <p class="element">element</p>
176
+
177
+ <p class="element">element</p>
178
+
179
+ <p class="element">element</p>
180
+
181
+ <p class="element">element</p>
182
+
183
+ <p class="element">element</p>
184
+
185
+ <p class="element">element</p>
186
+
187
+ <p class="element">element</p>
188
+
189
+ <p class="element">element</p>
190
+
191
+ <p class="element">element</p>
192
+
193
+ <p class="element">element</p>
194
+
195
+ <p class="element">element</p>
196
+
197
+ <p class="element">element</p>
198
+
199
+ <p class="element">element</p>
200
+
201
+ <p class="element">element</p>
202
+
203
+ <p class="element">element</p>
204
+
205
+ <p class="element">element</p>
206
+
207
+ <p class="element">element</p>
208
+
209
+ <p class="element">element</p>
210
+
211
+ <p class="element">element</p>
212
+
213
+ <p class="element">element</p>
214
+
215
+ <p class="element">element</p>
216
+
217
+ <p class="element">element</p>
218
+
219
+ <p class="element">element</p>
220
+
221
+ <p class="element">element</p>
222
+
223
+ <p class="element">element</p>
224
+
225
+ <p class="element">element</p>
226
+
227
+ <p class="element">element</p>
228
+
229
+ <p class="element">element</p>
230
+
231
+ <p class="element">element</p>
232
+
233
+ <p class="element">element</p>
234
+
235
+ <p class="element">element</p>
236
+
237
+ <p class="element">element</p>
238
+
239
+ <p class="element">element</p>
240
+
241
+ <p class="element">element</p>
242
+
243
+ <p class="element">element</p>
244
+
245
+ <p class="element">element</p>
246
+
247
+ <p class="element">element</p>
248
+
249
+ <p class="element">element</p>
250
+
251
+ <p class="element">element</p>
252
+
253
+ <p class="element">element</p>
254
+
255
+ <p class="element">element</p>
256
+
257
+ <p class="element">element</p>
258
+
259
+ <p class="element">element</p>
260
+
261
+ <p class="element">element</p>
262
+
263
+ <p class="element">element</p>
264
+
265
+ <p class="element">element</p>
266
+
267
+ <p class="element">element</p>
268
+
269
+ <p class="element">element</p>
270
+
271
+ <p class="element">element</p>
272
+
273
+ <p class="element">element</p>
274
+
275
+ <p class="element">element</p>
276
+
277
+ <p class="element">element</p>
278
+
279
+ <p class="element">element</p>
280
+
281
+ <p class="element">element</p>
282
+
283
+ <p class="element">element</p>
284
+
285
+ </div>
286
+
287
+ </body>
288
+
289
+ </html>
290
+
291
+ ```