【问题标题】:Unresponsive Google Chrome while running HTML5 Web workers运行 HTML5 Web Worker 时 Google Chrome 无响应
【发布时间】:2012-11-01 04:09:16
【问题描述】:

我正在使用以下代码运行 webworker 以在最新的 Google Chrome 中的网页中处理素数

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

但是,在单击启动 Worker 按钮后,停止按钮会在一段时间内无响应。大约 30 秒后,它在鼠标悬停时变为活动状态。这在 Firefox 中不会发生。

代码有缺陷吗?

prime.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”按钮后,您将有一段时间无法更改幻灯片。理想情况下,它不应该发生,因为繁重的计算被委派给单独的网络工作者。

【问题讨论】:

  • 它不会在我的 Win7 双核上的 Chrome (22.0.1229.94 m) 中锁定,至少不会锁定 30 秒,并且数字会不断变化。
  • 哦,您可以通过缓存 sqrt 值(以消除对 Math.sqrt 的额外调用)并每 2 步而不是 1 步来加快速度:var max=sqrt(n); for(var i=3; i &lt;= max; i += 2) - 您需要检查 2分别地。并且每次也将n 增加 2!
  • @PhilH 它不会像我一样完全冻结,但它会在大约 1 秒内显示一个数字,它应该像一段时间后一样不断增加。目标不是提高算法的性能,目标是在单独的工作人员中保持重量级算法,并且根本不让浏览器影响检查此dl.dropbox.com/u/655237/events/gdg-html5/index.html#/webworkers您无法在单击“后用箭头键更改幻灯片”启动工作人员”按钮。

标签: javascript performance html google-chrome web-worker


【解决方案1】:

我相信这段对话在这里很重要:https://code.google.com/p/chromium/issues/detail?id=85686

在自己尝试之后,LatinSuD's comment 似乎是对的:

我想我有一个解释。工作人员和主页之间的通信过多。 我将worker修改为每1000只报告一个素数,并且运行流畅。 有点像“前几百万的素数密度太高了”。

【讨论】:

    猜你喜欢
    • 2012-06-18
    • 2013-01-09
    • 2014-10-16
    • 1970-01-01
    • 2013-10-20
    • 2017-06-17
    • 1970-01-01
    • 2018-01-23
    • 2019-07-18
    相关资源
    最近更新 更多