IE:执行500W以上JScript引擎语句时提示。火狐:执行10秒以上提示。Safari:当您运行超过5秒时,系统会提示您。Opera:无论执行多长时间都不会有提示,所以是最有耐心的。Chrome:大约8秒后出现提示(估计值)。注意:当弹出类似报警的模式对话框时,不会计时。在开发Web时,经常会遇到浏览器提示脚本运行时间过长的情况,所以停止或继续。不管你选择什么,相信你都会想尽一切办法让这个对话框远离你的用户。你知道这些不同的浏览器是如何判断哪些脚本失控的吗?本文作者从Internet Explorer、Firefox、Safari、Chrome和Opera五种浏览器分析了造成这种情况的原因。【原标题】是什么决定了一个脚本是长时间运行的?【作者】Nicholas C. Zakas以下是原文的翻译:Web开发人员经常遇到且必须及时处理的问题是“提示脚本运行时间过长的提示框”(或“失控脚本提示”),当您的脚本运行时间过长时,就会出现这些烦人的对话框。Web开发人员的基本规则是,永远不要让用户在任何时候看到这些对话框,因为这会给人留下代码没有结构化的印象,更简单的说,你的代码负担太重了。用Brendan Eich(JavaScript的发明者)的话来说,如果JavaScript的运行时间需要用秒来计算,那肯定是有问题的。我个人能容忍的上限可以小一点。无论在任何时间、任何浏览器上执行什么脚本,都不应超过100毫秒。如果实际执行时间比这个限制长,流程必须分解成几个更小的代码段。另外,其实很少有人真正意识到是什么原因导致脚本在不同的浏览器中运行时间过长,甚至我自己都没有深入研究过。所以我决定坐下来仔细研究一下,我们发现在什么情况下我们会看到那个烦人的对话框。判断一个剧本是否失控,只有两种方法。一个是根据已经执行了多少条语句,另一个是判断脚本执行所花费的时间。判断脚本失控的具体方法,各个浏览器略有不同。Internet Explorer Internet Explorer判断一个脚本是否失控,主要是通过JScript引擎执行的语句总数。默认情况下,上限为500万条语句,并且可以通过注册表修改该值。当脚本执行的语句数超过此限制时,您将看到以下窗口。
此对话框提示:“此页面上有一个脚本导致Internet Explorer运行缓慢。如果继续运行,您的计算机可能会变得没有响应”。要不是追求技术精度,这确实有点过分了。该对话框有两个选项,要么停止脚本执行,要么允许脚本继续运行。显示此对话框时,脚本已完全停止。如果您选择继续运行脚本,将重新计算当前执行的语句数,也就是说,如果该数再次达到上限,您将再次看到此对话框。火狐根据脚本引擎持续执行代码的时间来判断脚本是否失控。默认上限为10秒,可以通过about:config页面进行修改。这里需要注意的是,当弹出类似alert的模式对话框时,是不定时的。当浏览器达到这个限制时,Firefox会显示一个类似如下的对话框:。
Firefox的对话框提示:“此页面上的一个脚本目前正忙,或者此脚本已停止响应。您可以停止执行此脚本并在调试器中打开它,也可以保持此脚本运行。它清楚地描述了遇到的问题,并不像IE说的那么可怕。在此对话框中,您可以执行三个操作:停止脚本执行、调试脚本或让脚本继续运行。与Internet Explorer一样,当运行脚本继续运行时,运行脚本的时间统计将被重置。“调试”按钮只会在您安装Firebug并在此页面上激活调试时出现。执行调试脚本操作后,可以显示执行时间过长的代码段的具体位置。Safari根据脚本引擎继续执行脚本的时间进行判断。反复研究Webkit的源代码,发现默认超时时间是5秒。一旦达到该上限,将给出如下对话框提示:。
对话框提示:“页面url上的脚本使Safari没有响应。您想继续运行脚本还是终止脚本?同样,对于用户来说,这也不是一个可怕的提醒。在Safari中,您可以关闭失控脚本的检测。Chrome在跟踪技术上有点棘手,失控脚本检测功能似乎与tab的崩溃控制有关。我仔细看了源代码,找不到具体的限制,但基本可以肯定的是,这个限制是基于时间的,估计是10秒左右(不是5秒就是10秒,总是和Safari或者Firefox不相上下)。我正在联系Chrome项目组的朋友,看能不能得到明确的信息。然而,如果网页中有失控的脚本,用户仍然会看到以下对话框:。
毫无疑问,Chrome的提示比其他浏览器更严肃。单击“等待”按钮,脚本将继续运行,直到达到下一个上限,或者单击“终止页面”直接关闭该页面内存中的所有信息,并用空白页替换。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上修复问题后,极有可能会在其他浏览器上正常工作。