[解決済み] WebWorkerの正規表現マッチの計算が遅い(3倍) - firefoxのみ
質問
まず最初に、プロジェクト内のすべてのヘッダーファイルのリストで、すべてのユニークな外部ライブラリのパスにマッチする正規表現を作成しました。 私はその正規表現を作ることに関して質問しました。 を作ることに関して質問しました。
私は、非同期およびWebワーカーになったときにどのように動作するかを確認するためにいじりはじめました。利便性と信頼性のために、私はこの 3 つのモードすべてで動作する汎用ファイルを作成しました。
/** Will call result() callback with every match it founds. Asynchronous unless called
* with interval = -1.
* Javadoc style comment for Arnold Rimmer and other Java programmers:
*
* @param regex regular expression to match in string
* @param string guess what
* @param result callback function that accepts one parameter, string match
* @param done callback on finish, has no parameters
* @param interval delay (not actual interval) between finding matches. If -1,
* function will be blocking
* @property working false if loop isn't running, otherwise contains timeout ID
* for use with clearTimeout
* @property done copy of done parameter
* @throws heavy boulders
**/
function processRegex(regex, string, result, done, interval) {
var m;
//Please tell me interpreter optimizes this
interval = typeof interval!='number'?1:interval;
//And this
processRegex.done = done;
while ((m = regex.exec(string))) {
Array.prototype.splice.call(m,0,1);
var path = m.join("");
//It's good to keep in mind that result() slows down the process
result(path);
if (interval>=0) {
processRegex.working = setTimeout(processRegex,
interval, regex, string,
result, done, interval);
// Comment these out for maximum speed
processRegex.progress = regex.lastIndex/string.length;
console.log("Progress: "+Math.round(processRegex.progress*100)+"%");
return;
}
}
processRegex.working = false;
processRegex.done = null;
if (typeof done=="function")
done();
}
processRegex.working = false;
私はテストファイルを作成しました、むしろそれをここに貼り付けるよりも、私は非常に信頼性の高いWebホスティングにそれをアップロードしました。 デモ - テストデータ .
私が非常に驚いているのは、RegExpのWeb Workerとブラウザの実行にこれほど大きな違いがあることです。私が得た結果です。
-
Mozilla Firefox
-
[WORKER]: Time elapsed:16.860s
-
[WORKER-SYNC]: Time elapsed:16.739s
-
[TIMEOUT]: Time elapsed:5.186s
-
[LOOP]: Time elapsed:5.028s
-
私の特定の正規表現では、同期ループと非同期ループの違いは重要ではないこともおわかりいただけるでしょう。ルックアヘッド式の代わりにマッチリストを使ってみたところ、結果は大きく変わりました。以下は、古い関数に対する変更点です。
function processRegexUnique(regex, string, result, done, interval) {
var matchList = arguments[5]||[];
... same as before ...
while ((m = regex.exec(string))) {
... same as before ...
if (matchList.indexOf(path)==-1) {
result(path);
matchList.push(path);
}
if (interval>=0) {
processRegex.working = setTimeout(processRegex, interval,
regex, string, result,
done, interval, matchList);
... same as before ...
}
}
... same as before ...
}
そして、その結果。
-
Mozilla Firefox
-
[WORKER]: Time elapsed:0.062s
-
[WORKER-SYNC]: Time elapsed:0.023s
-
[TIMEOUT]: Time elapsed:12.250s
(自分へのメモ: 刻一刻と変になっていく) -
[LOOP]: Time elapsed:0.006s
-
このような速度の違いを説明できる人はいますか?
どのように解決するのですか?
一連のテストの後、私はこれを確認しました。 Mozilla Firefox の問題であることを確認しました (私が試したすべての Windows デスクトップ バージョンに影響します)。Google Chrome、Opera、または Firefox モバイルでは、正規表現のマッチングは、ワーカーであるかどうかにかかわらず、ほぼ同じように行われます。
この問題を修正する必要がある場合は、次のように投票してください。 バグジラのバグ レポート . 何か変更があれば、追加情報を追加するようにします。
関連
-
[解決済み] CSSでFirefoxだけをターゲットにする
-
[解決済み] ユーザー入力文字列を正規表現に変換する
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] 上級者向けJavaScript。この関数はなぜ括弧でくくられるのですか?重複
-
[解決済み] 文字列のn番目の出現箇所を取得するには?
-
[解決済み] モバイルWeb HTML5フレームワークの選び方【終了しました
-
[解決済み] Javascript 空の配列の削減
-
[解決済み] AJAX Mailchimp サインアップフォームの統合
-
[解決済み] 文字列とラベルのローカライズとグローバリゼーションのベストプラクティス【終了しました
-
[解決済み] javascript の正規表現で単語をマッチングさせない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] モバイルWeb HTML5フレームワークの選び方【終了しました
-
[解決済み] React js 親コンポーネントから子コンポーネントの状態を変更する
-
[解決済み] jQueryで入力ファイルが空かどうかをチェックする方法
-
[解決済み] JSHintの'+'前の改行不良の説明
-
[解決済み] Chromeのwebkitインスペクタで「Unsafe JavaScript attempt to access frame with URL...」というエラーが継続的に発生する。
-
[解決済み] Prototypeを使ってtextareaを自動サイズ調整するには?
-
[解決済み] jQueryを使用して、すべてのクリックイベントハンドラを削除するにはどうすればよいですか?
-
[解決済み] Node.jsのES6クラスをrequireで作る
-
[解決済み] 変異を伴わないオブジェクトからの値の削除