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

質問編集履歴

2

計測結果を追記

2016/03/25 11:36

投稿

flat
flat

スコア617

title CHANGED
File without changes
body CHANGED
@@ -7,6 +7,9 @@
7
7
  この結果からすると、高速に処理できるという点は間違いないと見て良いのでしょうか。
8
8
  それとも、この計測の仕方が適切ではないだけでしょうか?
9
9
  ちなみに、使用したブラウザはGoogle Chrome 49です。
10
+
11
+ **追記**
12
+ 一応計測結果をコードの方に追記
10
13
  ```HTML
11
14
  <!DOCTYPE html>
12
15
  <html lang="ja">
@@ -15,31 +18,88 @@
15
18
  <title>example</title>
16
19
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
17
20
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
21
+ <style type="text/css">
22
+ .check {
23
+ color: red;
24
+ }
25
+ </style>
18
26
  <script type="text/javascript">
19
27
  ;( function () {
20
28
  'use strict';
21
29
  function func(event) {
22
- var doc = event.target;
30
+ var doc = event.target;
31
+
32
+ console.time('get');
33
+
34
+ // getElementsByTagName = HTMLCollection
35
+ var elements = doc.getElementsByTagName('p');
36
+
37
+ // getElementsByClassName = HTMLCollection
23
38
  //var elements = doc.getElementsByClassName('element');
39
+
40
+ // querySelectorAll = NodeList
41
+ //var elements = doc.querySelectorAll('.element');
42
+
43
+ // Array
24
- var elements = Array.prototype.slice.call(doc.getElementsByClassName('element'));
44
+ //var elements = Array.prototype.slice.call(doc.getElementsByClassName('element'));
45
+
25
- // お手数ですがコメントアウトを切り替えてコンソールを確認してみてください
46
+ console.timeEnd('get');
47
+
26
- var l = elements.length;
48
+ var l = elements.length;
27
49
  var element;
28
50
 
29
- console.time('time');
51
+ console.time('for');
30
52
  for (var i = 0; i < l; i++) {
31
53
  element = elements[i];
32
54
  element.className = element.className + ' check';
33
55
  }
34
- console.timeEnd('time');
56
+ console.timeEnd('for');
35
57
  }
36
58
 
37
59
  document.addEventListener('DOMContentLoaded', func, false);
60
+
61
+ /*
62
+ * 取得(処理時間が短い順)
63
+ *
64
+ * getElementsByTagName & getElementsByClassName
65
+ * 要素数1000: 約0.03ms
66
+ * 要素数10000: 約0.03ms
67
+ *
68
+ * querySelectorAll
69
+ * 要素数1000: 約0.1ms
70
+ * 要素数10000: 約0.4ms
71
+ *
72
+ * Array(Array.prototype.slice.call(HTMLCollection)で配列に変換)
73
+ * 要素数1000: 約2.5ms
74
+ * 要素数10000: 約7ms
75
+ * 要素の取得時間というよりは、ほぼ変換処理にかかる時間
76
+ */
77
+
78
+ /*
79
+ * forループ処理(処理時間が短い順)
80
+ *
81
+ * Array
82
+ * 要素数1000: 約0.8ms
83
+ * 要素数10000: 約9ms
84
+ *
85
+ * getElementsByTagName
86
+ * 要素数1000: 約2.5ms
87
+ * 要素数10000: 約12ms
88
+ *
89
+ * querySelectorAll
90
+ * 要素数1000: 約2.6ms
91
+ * 要素数10000: 約13ms
92
+ *
93
+ * getElementsByClassName
94
+ * 要素数1000: 約15ms
95
+ * 要素数10000: 約756ms
96
+ */
38
97
  }());
39
98
  </script>
40
99
  </head>
41
100
  <body>
42
101
  <div class="elements">
102
+ <!-- 100 element -->
43
103
  <p class="element">element</p>
44
104
  <p class="element">element</p>
45
105
  <p class="element">element</p>

1

計測内容の追記

2016/03/25 11:36

投稿

flat
flat

スコア617

title CHANGED
File without changes
body CHANGED
@@ -1,2 +1,146 @@
1
1
  NodeListやHTMLCollectionといったArray-Like ObjectをArray Objectに変換すると、ループ処理などの時に高速に処理できるという旨の情報を目にしたのですが、これは`getElementsBy~`などで取得したArray-Like Objectに対して「とりあえずやっておく」というおまじない的なレベルで利用できるものと見て良いのでしょうか?
2
- また、Array Objectにすることによる他のメリットやデメリットなどもあればお聞きしたいです。
2
+ また、Array Objectにすることによる他のメリットやデメリットなどもあればお聞きしたいです。
3
+
4
+ **追記**
5
+ 実際に100個の要素を`getElementsByClassName`で取得してループさせ、`className`プロパティを使ってクラスを追加するという内容で処理時間を比較して計測したところ、2倍以上の処理時間を短縮を確認できました。
6
+ また、`element.className = element.className + ' check';`を削除するとその差がより大きくなり、少なくとも20倍の差が開きました。
7
+ この結果からすると、高速に処理できるという点は間違いないと見て良いのでしょうか。
8
+ それとも、この計測の仕方が適切ではないだけでしょうか?
9
+ ちなみに、使用したブラウザはGoogle Chrome 49です。
10
+ ```HTML
11
+ <!DOCTYPE html>
12
+ <html lang="ja">
13
+ <head>
14
+ <meta charset="utf-8">
15
+ <title>example</title>
16
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
17
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
18
+ <script type="text/javascript">
19
+ ;( function () {
20
+ 'use strict';
21
+ function func(event) {
22
+ var doc = event.target;
23
+ //var elements = doc.getElementsByClassName('element');
24
+ var elements = Array.prototype.slice.call(doc.getElementsByClassName('element'));
25
+ // お手数ですがコメントアウトを切り替えてコンソールを確認してみてください
26
+ var l = elements.length;
27
+ var element;
28
+
29
+ console.time('time');
30
+ for (var i = 0; i < l; i++) {
31
+ element = elements[i];
32
+ element.className = element.className + ' check';
33
+ }
34
+ console.timeEnd('time');
35
+ }
36
+
37
+ document.addEventListener('DOMContentLoaded', func, false);
38
+ }());
39
+ </script>
40
+ </head>
41
+ <body>
42
+ <div class="elements">
43
+ <p class="element">element</p>
44
+ <p class="element">element</p>
45
+ <p class="element">element</p>
46
+ <p class="element">element</p>
47
+ <p class="element">element</p>
48
+ <p class="element">element</p>
49
+ <p class="element">element</p>
50
+ <p class="element">element</p>
51
+ <p class="element">element</p>
52
+ <p class="element">element</p>
53
+ <p class="element">element</p>
54
+ <p class="element">element</p>
55
+ <p class="element">element</p>
56
+ <p class="element">element</p>
57
+ <p class="element">element</p>
58
+ <p class="element">element</p>
59
+ <p class="element">element</p>
60
+ <p class="element">element</p>
61
+ <p class="element">element</p>
62
+ <p class="element">element</p>
63
+ <p class="element">element</p>
64
+ <p class="element">element</p>
65
+ <p class="element">element</p>
66
+ <p class="element">element</p>
67
+ <p class="element">element</p>
68
+ <p class="element">element</p>
69
+ <p class="element">element</p>
70
+ <p class="element">element</p>
71
+ <p class="element">element</p>
72
+ <p class="element">element</p>
73
+ <p class="element">element</p>
74
+ <p class="element">element</p>
75
+ <p class="element">element</p>
76
+ <p class="element">element</p>
77
+ <p class="element">element</p>
78
+ <p class="element">element</p>
79
+ <p class="element">element</p>
80
+ <p class="element">element</p>
81
+ <p class="element">element</p>
82
+ <p class="element">element</p>
83
+ <p class="element">element</p>
84
+ <p class="element">element</p>
85
+ <p class="element">element</p>
86
+ <p class="element">element</p>
87
+ <p class="element">element</p>
88
+ <p class="element">element</p>
89
+ <p class="element">element</p>
90
+ <p class="element">element</p>
91
+ <p class="element">element</p>
92
+ <p class="element">element</p>
93
+ <p class="element">element</p>
94
+ <p class="element">element</p>
95
+ <p class="element">element</p>
96
+ <p class="element">element</p>
97
+ <p class="element">element</p>
98
+ <p class="element">element</p>
99
+ <p class="element">element</p>
100
+ <p class="element">element</p>
101
+ <p class="element">element</p>
102
+ <p class="element">element</p>
103
+ <p class="element">element</p>
104
+ <p class="element">element</p>
105
+ <p class="element">element</p>
106
+ <p class="element">element</p>
107
+ <p class="element">element</p>
108
+ <p class="element">element</p>
109
+ <p class="element">element</p>
110
+ <p class="element">element</p>
111
+ <p class="element">element</p>
112
+ <p class="element">element</p>
113
+ <p class="element">element</p>
114
+ <p class="element">element</p>
115
+ <p class="element">element</p>
116
+ <p class="element">element</p>
117
+ <p class="element">element</p>
118
+ <p class="element">element</p>
119
+ <p class="element">element</p>
120
+ <p class="element">element</p>
121
+ <p class="element">element</p>
122
+ <p class="element">element</p>
123
+ <p class="element">element</p>
124
+ <p class="element">element</p>
125
+ <p class="element">element</p>
126
+ <p class="element">element</p>
127
+ <p class="element">element</p>
128
+ <p class="element">element</p>
129
+ <p class="element">element</p>
130
+ <p class="element">element</p>
131
+ <p class="element">element</p>
132
+ <p class="element">element</p>
133
+ <p class="element">element</p>
134
+ <p class="element">element</p>
135
+ <p class="element">element</p>
136
+ <p class="element">element</p>
137
+ <p class="element">element</p>
138
+ <p class="element">element</p>
139
+ <p class="element">element</p>
140
+ <p class="element">element</p>
141
+ <p class="element">element</p>
142
+ <p class="element">element</p>
143
+ </div>
144
+ </body>
145
+ </html>
146
+ ```