最近のDOMの取得について整理してみた

自分は普段からJavascriptを書く機会が多いのですが、Webサイト構築ではDOMを扱うことがほとんどです。
最近はjQueryなどのライブラリを利用する方が多いのではないでしょうか。
今回はDOMを取得する際のパフォーマンスに着眼して、今一度整理してみたいと思います。

とりあえずテストしてみた

JSPerfで要素を取得するメソッドをそれぞれ追加しました。
basic DOM selector test | JSPerf

そして、自分の所持している PC , SP の各ブラウザからRUNボタンをポチポチ押します。

テスト項目

テスト項目は以下の通りです。
ピュアなJSでの取得とjQueryでの取得を選択しています。

  • getElementById
  • getElementsByTagName
  • getElementsByClassName
  • querySelector
  • querySelectorAll
  • $(id)
  • $(tagName)
  • $(className)
  • $(tag+class)
  • $([attribute])

htmlにはdiv#hoge.boxを一つのみ配置しました。
理由は純粋に一つの要素を取得するという結果が欲しかった為です。
なので、要素の数が多くなればテスト結果も当然変わります。

また、jQueryのバージョンは2.0.0としました。
IE8以下は未対応となっています。

現状の結果

JSPerf
(2013/05/26現在)

  1. getElementById
  2. getElementsByTagName or getElementsByClassName
  3. $(id)
  4. querySelector
  5. $(className)
  6. querySelectorAll
  7. $(tagName)
  8. $(tag+class)
  9. $([attribute])
    (以上、処理が早い順)

要素単体を取得するには、
getElementsByIdが最も高速であるのは有名な話しで、実際に上記のテスト結果からみてもその通りです。

今回jQueryでのテストも含めてあるのですが、
IDを指定していたとしても
jQueryオブジェクトへの変換によるオーバーヘッドがかかる分、DOMを取得する処理に時間がかかっているのがわかります。
jQuery使った方がそれはもう便利ですけどね。。

また、スマートフォンでのJS実行速度自体がとても遅いのです。。
上の画像の一段目(Android 2.3)と下から2段目(Mobile safari)を見てもらえると一目瞭然です。
出来ればもうライブラリに頼らずにJSを書きたいところですね。

まとめ

パフォーマンスを気にする場面では、出来るだけライブラリに頼らないJSを書きましょう。
スマートフォンに関しても同じことが言えます。
しかしjQueryはものすごく便利なので、使わないことに固執しないことが良いと思います。

日頃なかなかパフォーマンステストが出来ていないので、いい機会になりました。

五十川 洋平(Yohei Isokawa)

五十川 洋平(Yohei Isokawa)

フロントエンドエンジニア/面白法人カヤックなどのWeb制作会社に勤務したのち、故郷の新潟に戻り独立。JSフレームワークAngularやFirebase、Google Cloud Platformを使ったWebアプリ開発が得意。 また、Udemyのプログラミング解説の講師、writer.appの自主開発や上越TechMeetupの主催などを行っています。

プロフィール

©Copyright 2022 Yohei Isokawa All Rights Reserved.