1

次のコードを使用して webworker を実行し、最新の Google Chrome の Web ページで素数を処理しています

https://dl.dropbox.com/u/655237/project/prime.html

ただし、Worker の開始ボタンをクリックすると、停止ボタンがしばらく反応しなくなります。30 秒ほど経過すると、マウスをホバーするとアクティブになります。これは Firefox では発生しません。

コードに欠陥はありますか?

プライム.html

        <section>
            Last Prime Found:-  <p id="number">NA</p>
            <button id="prime">Find &nbsp; Prime</button>
            <button id="primew">Start &nbsp;Worker</button>
            <button id="primes">Stop &nbsp;Worker</button>
        </section>
        <script>
            var worker;
            document.querySelector('#prime').addEventListener('click', function () {
                findPrime();
            }, false);
            document.querySelector('#primew').addEventListener('click', function () {
                findPrimeW();
            }, false);
            document.querySelector('#primes').addEventListener('click', function () {
                stopWorker();
            }, false);

            function findPrime(){
                var n = 1;
                search: while (true) {
                    n += 1;
                    for (var i = 2; i <= Math.sqrt(n); i += 1)
                        if (n % i == 0)
                            continue search;
                    // found a prime!
                    document.querySelector("#number").textContent=n;
                }
            }
            function findPrimeW(){
                worker = new Worker('js/worker1.js');
                worker.onmessage = function (event) {
                    document.querySelector("#number").textContent = event.data;
                };
            }

            function stopWorker()
            { 
                worker.terminate();
            }
        </script>

worker1.js

    var n = 1;
search: while (true) {
  n += 1;
  for (var i = 2; i <= Math.sqrt(n); i += 1)
    if (n % i == 0)
     continue search;
  // found a prime!
  postMessage(n);
}

別の例はこれです https://dl.dropbox.com/u/655237/events/gdg-html5/index.html#/webworkers

「Start Worker」ボタンをクリックしてからしばらくの間、スライドを変更できません。理想的には、重い計算は別の Web ワーカーに委譲されるため、これは発生しないはずです。

4

1 に答える 1

0

この会話はここに関連していると思います: https://code.google.com/p/chromium/issues/detail?id=85686

自分で試してみたところ、LatinSuD のコメントは正しいようです。

説明はあると思います。ワーカーとメイン ページ間の通信が多すぎます。1000 ごとに 1 つの素数のみを報告するようにワーカーを変更したところ、スムーズに動作しました。「最初の数百万の素数密度が高すぎる」のようなものです。

于 2013-05-03T23:50:13.113 に答える