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

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

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

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

JavaScript

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

HTML

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

Q&A

解決済

3回答

1233閲覧

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

kouki5512

総合スコア4

JSON

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

JavaScript

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

HTML

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

0グッド

1クリップ

投稿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();

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

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

回答3

0

ベストアンサー

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
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kouki5512

2023/01/21 15:46

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

退会済みユーザー

2023/01/21 15:54 編集

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

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

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2023/01/22 06:09

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問