javascript - 运行 HTML5 Web Worker 时 Google Chrome 无响应

标签 javascript performance html google-chrome web-worker

我正在使用以下代码来运行 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

点击“启动Worker”按钮后一段时间内无法更改幻灯片。理想情况下,这种情况不应该发生,因为重量级计算被委托(delegate)给单独的网络 worker 。

最佳答案

我相信此对话与此相关:https://code.google.com/p/chromium/issues/detail?id=85686

亲自尝试后,LatinSuD's comment看来是对的:

I think I have an explanation. There is too much communication between worker and main page. I modified the worker to only report one prime number each 1000, and it works smooth. Kind of "prime numbers density is too high in the first millions".

关于javascript - 运行 HTML5 Web Worker 时 Google Chrome 无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13170828/

相关文章:

javascript - 在函数中将字符串与变量连接时出现无效的左侧参数错误

javascript - 如何触发浏览器的实际 "Enter"按键事件?

javascript - 如何在 Odoo 10 的 JavaScript 中获取当前记录?

javascript - 视频播放,然后 onend() 覆盖带有链接的静态图像

performance - Pandas 系列与单个向量的相关性

javascript - 阅读更多折叠脚本更改

html - 为什么 div 百分比 margin 不正确?

javascript - 从服务器端返回 Javascript 对象有什么好处?

c# - 与平面数组相比,.Net 中的简单字典查找速度较慢

html - 为 QA 自动化添加 ids 到 HTML 标签