WebWorkerは遅い正規表現の一致を大幅に遅く計算します(3倍)-Firefoxのみ


85

まず、プロジェクト内のすべてのヘッダーファイルのリストにあるすべての一意の外部ライブラリパスに一致する正規表現を自分で作成しました。1週間前にその正規表現を作成することについて質問しました。

私は、非同期のときと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の実行に大きな違いがあることです。私が得た結果:

  • 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

誰かがそのような速度の違いを説明できますか?


6
このためにFirefoxのバグを報告した場合、質問にバグのURLを追加していただけますか?また、Firefoxのバグをまだ提出していない場合は、時間をかけて検討してください。
sideshowbarker 2015年

@sideshowbarker Firefoxのバグを報告する場所をグーグルで検索しましたが、失敗しました。そこで、firefoxの入力で「バグを報告する場所が見つかりません」(「Firefoxは私を悲しませた」)という苦情を記入し、あきらめました。バグを報告する場所を知っている場合(そしてそれは実際の報告手順であり、ユーザーフィードバックのためのシンクではありません)、教えてください。Firefoxのみとして確実に再現および識別できる問題を見つけたのはこれが初めてではありません。
トマシュザト-モニカを復活させる2015年

1
ええ、彼らはそれを可能な限り明確にしないことに同意しました。とにかく、この特定のバグについては、bugzilla.mozilla.org /を使用してくださいこれDOM: Workersにより、適切なbugzillaCore製品の適切なbugzillaコンポーネントに対してバグが発生します。
sideshowbarker 2015年

1
他の人がFirefoxブラウザエンジンのバグを報告する場所を見つけようとして遭遇したのと同じ欲求不満を回避するのを助けるために、私はstackoverflow.com/questions/33059442/…を作成しました。 StackOverflow、賛成票を投じることを検討してください(そうしないと、他のひざまずくすべてのものに近い反対派がバンドワゴンに飛び乗った場合、削除されるリスクがあります)。
sideshowbarker 2015年

1
パターンは意図的に遅いです。はるかに効率的な方法は、先読みをスキップして、代わりに参照配列を使用することです。しかし、この質問は実際には最適なコードを書くことについてではありません。
トマシュザト-モニカを復活させる2015年

回答:


2

一連のテストの結果、これがMozilla Firefoxの問題であることを確認しました(試したす​​べてのWindowsデスクトップバージョンに影響します)。Google Chrome、Opera、さらにはFirefox mobileでも、正規表現の一致は、ワーカーであるかどうかに関係なく、ほぼ同じです。

この問題を修正する必要がある場合は、必ずbugzillaのバグレポートに投票してください。何か変更があれば、追加情報を追加しようと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.