質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • JavaScript

    16348questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • HTML

    8931questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • CSS

    5759questions

    CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

  • HTML5

    4001questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

  • CSS3

    2056questions

    CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

JSで高速なのはどっちなのか。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 277

2001Y

score 57

JSについて詳しくないのですが、createElementで作成して入れるのと、手動でくっつけて追加するのはどちらの方が高速なのでしょうか。

let a = document.createElement("a");
a.href = json[i].link;
a.target = "_blank";
let div = document.createElement("div");
let strong = document.createElement("strong");
strong.innerText(json[i].title);
div.appendChild(strong)
let p = document.createElement("p");
p.innerText(json[i].snippet);
div.appendChild(p)    
document.getElementById('SearchResults').appendChild(div)
let o = "<a href=";
let p = " target=&quot;_blank&quot;><div><strong>";
let q = "</strong><p>";
let r = "</p></div></a>";
document.getElementById('SearchResults').insertAdjacentHTML('beforeend', o + json[i].link + p + json[i].title + q + json[i].snippet + r);


また、子要素に追加するとき、insertAdjacentHTMLとappendChildどちらの方が高速なのでしょうか。
JSの基礎などでもいいので教えてください。

 追記

教えていただいたFragmentを使って見ました。
テンプレ化することで高速になると聞きましたが、約10回ほどの繰り返しの場合はどちらの方が早いのでしょうか。

for (let i = 0; i < length|0; i=(i+1)|0) {
  let a = document.createElement("a");
  a.href = json[i].link;
  a.target = "_blank";
  let div = document.createElement("div");
  let strong = document.createElement("strong");
  strong.innerText(json[i].title);
  div.appendChild(strong)
  let p = document.createElement("p");
  p.innerText(json[i].snippet);
  div.appendChild(p)    
  fragment.appendChild(div);
}
document.getElementById('test').appendChild(fragment);
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2018/07/20 07:28

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • mts10806

    2018/07/20 08:17

    自身で試した結果をまずは提示してください。処理時間をはかるのも自身で簡単な記述でできます。 http://write-remember.com/program/javascript/console_time/

    キャンセル

  • 2001Y

    2018/07/20 09:46

    なるほどこんなものがあるんですね!ありがというございます!

    キャンセル

  • x_x

    2018/07/20 09:54

    innerText()メソッドは間違いでしょうか?

    キャンセル

回答 3

checkベストアンサー

+5

外部ソースがHTMLで与えられるような場合は別ですが、できるだけHTMLからエレメントを起こすのは避けて、setAttributeappendChildtextContentなどのエレメントを直接操作するDOM APIを使いましょう。

速度面でもたしかに有利なのですが、それより大きなメリットとして、XSS対策になるということがあります。

HTMLで書いた場合、何が来てもそのままHTMLとして解釈されますので、HTML断片が紛れ込んでいた場合もエスケープしなければそのままタグが有効となってしまいますが、textContentcreateTextNodeを使えば、何を投げ込んでも完全にテキストとしてしか認識されず、意図しないところからタグが発生してしまうこともなくなります。

属性を与える場合も、HTML文字列の合成では区切り文字などを混ぜ込むことで意図しない属性を増やされるなど、不適切なHTMLを生成させられる危険がありますが、setAttributeを使えば与えた値は必ず「1つの属性」になってくれます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/20 09:57

    なお、innerTextはメソッドではなくプロパティなので、「node.innerText = 'string';」のように使います。

    キャンセル

  • 2018/07/20 19:44

    なるほど...ありがとうございます!
    追記の方も教えていただければと思います。

    キャンセル

  • 2018/07/20 21:12

    たった10回の操作では絶対的な時間が短いので、よほど特殊な条件でない限り気にする必要があるほどの差は出ないと思います。

    キャンセル

  • 2018/07/21 00:13

    なるほど、そうなると文字の少ない無理やり書いた方が良いのかもしれませんね!

    キャンセル

+4

innerTextを修正しても両者は違う処理です。
前者:divを突っ込んでいる
後者:エスケープしていない

最適化が進んでいて、ループ回数での場合分けもしているみたいですのでなかなか比較は難しいのですが、このような0.1msにも満たない処理を気にするのは繰り返し処理するからだと思います。
その場合はDocumentFragmentを使いましょう。テンプレートも使い、あらかじめ各ノードを取得しておけばいいです。
https://html5experts.jp/yoshikawa_t/1932/
(ここの例はあらかじめノードを取得していません。もっと速くできます)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/20 19:43 編集

    Fragment知りませんでしたありがとうございます!
    追記の方も教えていただければと思います。

    キャンセル

+2

原則おなじような冗長な処理をするならDOMの方がコストが高いでしょう
しかしDOMもFragmentしたり繰り返し処理をCloneで処理したりすると
効率化を図れるので必ずしもパフォーマンスが悪いとはいえません
逆にDOMを使わない場合、すべてが文字列としてあつかわれるということになり
任意にエスケープ処理などをしないといけないので、
その分描画や文書構造の構築以外の部分でのコストがかかります。

参考:DOM操作の最適化によるJavaScriptチューニング

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/20 19:44

    Fragment知りませんでしたありがとうございます!
    追記の方も教えていただければと思います。

    キャンセル

  • 2018/07/20 19:48

    奇しくもx_xさんと同じページの紹介になってますね

    キャンセル

  • 2018/07/20 19:53

    そうでした。
    しかし、下の方にも気にする必要はないなど、詳しく書いてあってわかりやすかったです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    16348questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • HTML

    8931questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • CSS

    5759questions

    CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

  • HTML5

    4001questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

  • CSS3

    2056questions

    CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。