我有 JavaScript,它执行大量计算以及从/向 DOM 读取/写入值。该页面很大,因此这通常最终会在 CPU 使用率为 100% 的情况下锁定浏览器长达一分钟(有时使用 IE 会更长)。
是否有任何关于优化 JavaScript 以防止这种情况发生的资源(我能找到的只是如何关闭 Firefox 的长时间运行的脚本警告)?
我有 JavaScript,它执行大量计算以及从/向 DOM 读取/写入值。该页面很大,因此这通常最终会在 CPU 使用率为 100% 的情况下锁定浏览器长达一分钟(有时使用 IE 会更长)。
是否有任何关于优化 JavaScript 以防止这种情况发生的资源(我能找到的只是如何关闭 Firefox 的长时间运行的脚本警告)?
如果你可以将你的计算算法变成可以迭代调用的东西,你可以通过使用带有短超时值的setTimeout以频繁的间隔释放对浏览器的控制。
例如,这样的事情......
function doCalculation()
{
//do your thing for a short time
//figure out how complete you are
var percent_complete=....
return percent_complete;
}
function pump()
{
var percent_complete=doCalculation();
//maybe update a progress meter here!
//carry on pumping?
if (percent_complete<100)
{
setTimeout(pump, 50);
}
}
//start the calculation
pump();
使用超时。
通过将循环的内容放入单独的函数中,并从 setTimeout() 以 50 左右的超时时间调用它们,javascript 将放弃对线程的控制并在一段时间后返回,从而允许 UI 获得顺便拜访。
有一个很好的workthrough这里。
前段时间我写了一篇关于浏览器内性能的博客,但让我在这里为您总结一下与 DOM 相关的内容。
然后还有一些与 JavaScript 本身相关的:
我的博客上还有一些(上面的链接)。
这仍然有点前沿,但 Firefox 3.5 有这些叫做 Web Workers 的东西,但我不确定它们在其他浏览器中的支持。
Resig 先生在这里有一篇关于它们的文章:http : //ejohn.org/blog/web-workers/
而模拟退火可能是它的最简单的例子,如果你会发现Firefox的纺纱标识不冻结,当工作线程正在做他们的请求(因此不冻结浏览器)。
您可以尝试在线程中执行长时间运行的计算(请参阅JavaScript 和 Threads),尽管它们不是很可移植。
您也可以尝试使用一些 Javascript 分析器来查找性能瓶颈。Firebug支持分析 javascript。