各浏览器脚本超时检测机制与耐性对比

作者:安全边界时间:2026-10-23 13:51:59浏览:369

本文对比分析了Internet Explorer、Firefox、Safari、Chrome和Opera五种主流浏览器对长时间运行脚本的检测机制与耐性差异。IE基于语句数量(默认500万),Firefox和Safari基于执行时间(分别10秒和5秒),Chrome约8-10秒,而Opera无明确限制。文章还提供了性能优化建议及测试工具推荐。

各浏览器脚本超时检测机制与耐性对比

Internet Explorer:当JScript引擎执行的语句超过500万条时,会弹出提示。


Firefox:当脚本执行时间超过10秒时,会弹出提示。


Safari:当脚本执行时间超过5秒时,会弹出提示。


Opera:无论脚本执行多久,均不会弹出提示,表现出最强的耐性。


Chrome:当脚本执行时间超过约8秒(估计值)时,会弹出提示。


注意:当弹出类似alert的模式对话框时,计时器暂停,不计算在超时时间内。



在Web开发中,经常遇到浏览器提示脚本运行时间过长并询问停止或继续的情况。无论用户如何选择,开发者都应力求避免此类对话框出现在最终用户面前。你是否了解不同浏览器判断脚本“失控”的具体机制?本文将以Internet Explorer、Firefox、Safari、Chrome和Opera这五种浏览器为例,深入分析这一现象背后的原因。

【原文标题】

What determines that a script is long-running?

【原文作者】

Nicholas C. Zakas

以下是对原文的翻译:

Web开发者经常遇到且必须立即处理的问题是“脚本运行时间过长的提示框”(亦称“失控脚本提示”)。当脚本执行时间过长时,这些令人困扰的对话框便会弹出。对于Web开发者而言,基本准则是绝不让用户看到此类对话框,因为这会给用户留下代码结构混乱、负担过重的印象。

JavaScript发明人Brendan Eich曾指出,如果JavaScript的执行时间需要用秒来衡量,那一定是代码出了问题。个人而言,可接受的上限可能更低:任何脚本在任何浏览器中执行,都不应超过100毫秒。若实际执行时间超过此阈值,必须将进程分解为更小的代码段。

此外,很少有人真正探究导致脚本在不同浏览器中运行时间过长的根本原因,包括我自己此前也未深究。因此,我决定深入研究何时会看到那个令人讨厌的对话框。判断脚本是否失控,主要依据两种方法:一是统计执行的语句数量,二是计算脚本持续执行的时间。各浏览器在具体判定方法上略有差异。

Internet Explorer

Internet Explorer

Internet Explorer主要通过统计JScript引擎执行的语句总数来判断脚本是否失控。默认上限为500万条语句,该值可通过注册表进行修改。当脚本执行的语句数量超过此限制时,用户将看到相应的提示窗口。

IE Dialog: A script on this page is causing Internet Explorer to run slowly. If it continues to run, your compute may become unresponsive.

该对话框提示:“页面上的一段脚本导致Internet Explorer运行缓慢,如果继续运行,计算机可能会变为无响应状态”。尽管这种说法在技术准确性上可能略显夸张,但确实反映了潜在风险。对话框提供两个选项:停止脚本执行或允许继续运行。当对话框出现时,脚本已被完全停止。若选择继续运行,系统将重新计算当前执行的语句数;若再次达到上限,则会再次弹出该对话框。

Firefox

Firefox

Firefox根据脚本引擎持续执行代码的时间来判断脚本是否失控。默认上限为10秒,可通过about:config页面进行修改。需要注意的是,当弹出类似alert的模式对话框时,计时器暂停,不计算在超时时间内。当浏览器执行脚本的时间达到此上限,Firefox会显示相应的对话框。

Firefox Dialog: A script on this page may be busy, or it may have stopped responding. You can stop the script now, open the script in the debugger, or let the script continue.

Firefox的对话框提示:“页面的一段脚本目前运行忙,或者这段脚本已经停止响应。你可以停止执行这段脚本,并在调试器中打开这段脚本,或者保持这段脚本继续运行”。该描述更清晰地说明了问题,且语气不如IE那样令人恐慌。在此对话框上可执行三种操作:停止脚本执行、调试脚本或让脚本继续运行。与Internet Explorer类似,当选择继续运行脚本后,对持续运行时间的统计将重置。调试脚本按钮仅在安装了Firebug并激活页面调试时出现。执行调试操作后,可显示执行时间过长的代码段的具体位置。

Safari

Safari

Safari同样根据脚本引擎持续执行脚本的时间来判断。在对Webkit源代码进行反复研究后,发现默认超时时间为5秒。一旦达到此上限,便会给出相应的对话框提示。

Safari Dialog: A script on the page [url] is making Safari unresponsive. Do you want to continue running the script, or stop it?

对话框提示:“页面url上的脚本让Safari失去响应,你是要继续运行脚本还是终止脚本”。对用户而言,这并非可怕的提示。在Safari中,用户可以关闭失控脚本的检测功能。

Chrome

Chrome

Chrome在跟踪技术上较为隐蔽,失控脚本检测功能似乎与标签页的崩溃控制(crash control)相关联。仔细查阅源代码后未找到具体限制值,但基本确定该限制基于时间,估计在10秒左右(可能是5秒或10秒,旨在与Safari或Firefox保持一致)。目前正联系Chrome项目组的朋友以获取确切信息。尽管如此,如果网页中存在失控脚本,用户仍会看到相应的对话框。

Chrome Dialog: The following page(s) have become unresponsive. You can wait for them to become responsive or kill them.

毫无疑问,Chrome的提示相比其他浏览器显得更为严重。点击“Wait”按钮,脚本会继续运行,直到达到下一个上限为止;也可以点击“Kill pages”,直接关闭该页面在内存中的所有信息,并用一个空白页取而代之。

Opera

Opera

Opera的情况较为有趣:它似乎没有针对失控脚本的相应限制。我运行了几个长时间的测试,甚至耗时几分钟,而在此过程中,浏览器一直能正常响应,这出乎我的意料。我不确定对于当前情况而言,这种方法是好是坏,但至少它有效运行了,不是吗?

性能优化建议

一些建议

无论用户使用何种浏览器,都不应看到此类提示。在网站或Web应用程序作为产品发布之前,进行常规的性能测试是非常必要的。在这方面有许多工具可供利用,例如Firebug的profiler(仅支持Firefox)、YUI Profiler(支持所有浏览器)或Internet Explorer 8的Profiler。应毫不犹豫地找出那些执行时间超过100毫秒的脚本,即使这些脚本仅在特定浏览器上运行不畅。这些脚本包含需要长时间执行的代码段,应通过性能检测工具重新评估。确保不要以Chrome作为测试底线,因为Chrome在执行JavaScript的速度上比其他浏览器高出一个数量级(与Firefox 3.1及最新的WebKit Nightly相当)。最好使用Internet Explorer作为测试底线,然后再测试其他浏览器,因为无论何时,IE的JavaScript引擎都是最慢的。当在IE上修复问题后,十有八九在其他浏览器上也能正常运行。

作者最新文章