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

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

新規登録して質問してみよう
ただいま回答率
86.02%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

HTML

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

Q&A

解決済

最速で配列からデータを取り出し、正規表現で検索したい。

kouki5512
kansai5512

総合スコア4

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

HTML

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

3回答

0グッド

1クリップ

315閲覧

投稿2023/01/21 12:27

前提

プログラムを最速化したいです。参考にしたサイトも載せているのですが、配列の方式、検索の仕方、ループ分それぞれどれを採用すれば良いか分かりません。
jsonからデータを取り出していますが、文字列を保存して配列にするつもりです。

プログラムの内容

BOT関連をユーザーエージェントに応じて判定し、該当すればjavascriptをhtmlに書き込むプログラムです。

実現したいこと

  • 配列からは最速でデータを取り出せるようにする
  • ループ分の最速のものにする
  • 検索方法も最速のものにする

参考にしたサイト

  1. https://qiita.com/keroxp/items/67804391a8d65eb32cb8
  2. https://nulab.com/ja/blog/nulab/100times-faster-performance-improvement-set-map/

該当のソースコード

javascript

1function getJSON() { 2 let req = new XMLHttpRequest(); 3 let Pattern; 4 let UserAgent = navigator.userAgent.replace(/\s+/g, ""); 5 let result; 6 req.onreadystatechange = function() { 7 // サーバーからのレスポンスが正常&通信が正常に終了したとき 8 if(req.readyState == 4 && req.status == 200) { 9 // 取得したJSONファイルの中身を変数へ格納 10 let data = JSON.parse(req.responseText); 11 // JSONのデータ数を取得 12 let i = 0; 13 let len = data.length; 14 15 for (i = 0; i < len; i=(i+1)|0){ 16 Pattern = new RegExp(data[i].pattern.replace(/\s+/g, "")); 17 18 if(Pattern.test(UserAgent) == true){ 19 result = true; 20 break; 21 } 22} 23 24 if(result == null){ 25 var script = document.createElement("script"); 26 script.type = "text/javascript"; 27 script.src = "/stats/JavaScript/maura-port-ship.js"; 28 document.head.appendChild(script); 29 } 30 31 } 32 }; 33 //HTTPメソッドとアクセスするサーバーのURLを指定 34 req.open("GET", "https://raw.githubusercontent.com/monperrus/crawler-user-agents/master/crawler-user-agents.json", false); 35 //実際にサーバーへリクエストを送信 36 req.send(null); 37} 38 39getJSON();

以下のような質問にはグッドを送りましょう

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

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

気になる質問をクリップする

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

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

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

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

適切な質問に修正を依頼しましょう。

2023/01/21 13:54

こちらの質問が他のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

yuma.inaura

2023/01/21 13:05

ベンチマークをとって試してみてはいかがですか
kouki5512

2023/01/21 13:10

とってます。遅いから質問しているのです。 よろしくお願いいたします。
yuma.inaura

2023/01/21 13:32

参考サイトのどれを採用すれば良いか分からないというのが質問だったんじゃないですか? どれも使い物にならないって事なんでしょうか
kouki5512

2023/01/21 13:58

いいえ、使い物になる前提で、有識者に意見を求めています。
maisumakun

2023/01/21 14:26

本当に、「検索やループ」で律速する状況なのでしょうか? レスポンスを得るまでの時間が支配的であれば、いくら後処理を改良しても改善の度合いは限られたものとなります。

回答3

1

ベストアンサー

jsonからデータを取り出していますが、文字列を保存して配列にするつもりです。

この部分が、仮に、ネットワーク経由で json を取得するのではなく
https://raw.githubusercontent.com/monperrus/crawler-user-agents/master/crawler-user-agents.json のデータから pattern を抜きだしてソースコード中に直接記述する」
という意味ならば、下記のような案が考えられます。

また、下記で有意な速度差を出すには、UserAgentのマッチング判定を、同じページ内で何回も繰り返す場合に限られます。
(一回しか判定しない場合は速度差はほとんどないものと考えられます)


js

1new RegExp(data[i].pattern.replace(/\s+/g, ""));

このようにループ中で正規表現オブジェクトを都度生成するのは、わずかながら遅くなる原因になると思います。

したがって、この部分はforループをなくしてあらかじめ正規表現リテラルを記述し、

js

1 if (/pattern1/.test(UserAgent) || 2 /pattern2/.test(UserAgent) || 3 /pattern3/.test(UserAgent) 4 .... 5 .... 6 .... 7 ) { 8 result = true; 9 break; 10 } 11 }

としてみてはいかがでしょうか。
(書くのが面倒なのは高速化の対価)
(ロード時のコンパイル時間との兼ね合いかもしれない)

投稿2023/01/21 14:44

編集2023/01/21 15:52
qnoir

総合スコア7834

penguin520👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

kouki5512

2023/01/21 15:46

ありがとうございます。 ただ記述の量が多くなるのと、配列で検索するより早いのか心配です。 一般的にどちらが早いのか存じますでしょうか?
qnoir

2023/01/21 15:54 編集

配列を使用する場合、正規表現リテラルを使えないので、RegExpオブジェクトをループ中で生成する必要があります。 スクリプト内で何回も判定を繰り返すという前提ならば、RegExoオブジェクトを生成するより、正規表現リテラルの方が早いです。 ただし(回答には追記したのですが)1回しかUserAgentを判定しない場合は、速度に有意な差は出ません。

0

同意します。 この記事で取り上げた、私や他の多くの興味のあるトピック.
Game with fiery fighting games on cuphead io

投稿2023/01/31 04:55

Timothy

総合スコア2

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

0

JSONは検索結果ですのでJSONでうけとったデータから検索をしようとしているのでしたら高速化は困難です。表示したい最小限の内容をサーバー側で抽出後受け取ればどの方法も誤差レベルの違いしか無いでしょう
また、JSONから受け取ったデータを単純に表示したいだけならむしろJSONではなくHTMLデータをサーバー側から抽出してもらって、単純に表示するほうがDOMの評価がない分高速になると思います

投稿2023/01/22 05:41

yambejp

総合スコア109020

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

yambejp

2023/01/22 06:09

ごめんなさい、表現がわかりにくかったかもしれません。 クライアント側で処理をするかぎり高速化は見込めないというだけです。

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

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

HTML

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