【发布时间】: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 Prime</button>
<button id="primew">Start Worker</button>
<button id="primes">Stop 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 <= 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