javascript - 调试错误消息:“此页面上的脚本导致Internet Explorer运行缓慢”

标签 javascript performance internet-explorer

我的一位用户间歇性地在IE 8中收到一个对话框,内容为:

此页面上的脚本导致Internet Explorer运行缓慢

MSDN论坛和Web上的其他位置已多次报告此问题。例如:


http://social.msdn.microsoft.com/Forums/ie/en-US/0fdb7550-0a59-4553-a90e-1958475f2ce5/how-to-debug-a-script-on-this-page-is-causing-internet-explorer-to-run-slowly?forum=iewebdevelopment
http://social.msdn.microsoft.com/Forums/ie/en-US/dafffdd8-a390-4a3c-a904-867acaec298e/error-message-a-script-on-this-page-is-causing-internet-explorer-to-run-slowly-for-ie8?forum=whatforum
http://social.msdn.microsoft.com/Forums/ie/en-US/e9d16d2a-60e1-4d6f-8f80-0d981eab3a2e/a-script-on-this-page-is-causing-your-web-browser-to-run-slowly?forum=bingmapsajax


因此,这个问题是这些问题和许多其他问题的重复。但这是有意重复,因为我认为这些问题中的任何一个都无法以帮助用户(开发人员)准确确定其场景中导致对话框出现的方式来回答。

我知道基于此页面:

http://support.microsoft.com/kb/175500

自新脚本开始执行以来(通过多种方式)执行了一定数量的语句后,将显示该对话框。默认情况下,语句数为5,000,000,但这可以通过注册表项进行配置。

解决此问题的一般方法是:


编写更少的代码。不幸的是,这并不总是可能的。
使用网络工作者。对于IE 10之前的IE,这不是一个选项,
一些移动浏览器。
使用setTimeOut,setInterval,事件处理程序等来中断
脚本了。这是所有浏览器的合法策略。


因此,我理解一般性问题是什么,并且再次理解一般性解决问题的选项。问题是,如何确定代码的哪些区域导致对话框显示给特定用户?通常,在很大的代码库(包括第三方库)中会出现此问题,因此在没有某些工具支持的情况下手动检查代码库是不可行的。

大多数浏览器(包括IE8和更高版本)都具有分析工具,使开发人员能够确定JavaScript CPU使用率。除IE之外,其他浏览器都不根据执行的语句数而是脚本执行所花费的时间来确定脚本的长时间运行。为此,浏览器中可用的探查器(或作为探查器使用)可识别执行某个功能(包括该功能的独占性和独占性)所花费的百分比,通常还包括原始时间,并且可以对结果进行分类。 IE的探查器还将为您提供函数调用频率的计数。这些剖析器中没有一个告诉您在分析过程中执行了一个函数中的多少条代码语句。他们只会告诉您在该函数上花费了多长时间,以及该函数被调用了多少次。这对IE缓慢的脚本对话框逻辑无济于事,后者基于已执行的语句数(而不是时间)。有时,执行函数所花费的时间与语句的数量之间存在相关性,但这并不是一种可靠的关系,因为不同类型的语句当然会花费非常不同的时间长度(例如,许多本机JavaScript函数的执行速度比更新DOM的调用;两者的语句计数相同,但前者的执行速度比后者快,因此检查%/原始时间不是很有用)。

我使用过的一种有价值的方法是,当出现缓慢的脚本对话框时,在IE中启动调试器(如果尚未启动),然后在调试器中选择“ next on next statement”命令。然后,在浏览器中单击对话框按钮,该对话框按钮可使慢速脚本继续执行。此时,将调用调试器,并且开发人员可以检查调用堆栈以确定慢脚本对话框出现时正在执行的操作。可以,但是这是一种非常手动的方法,不能保证不会运行多个脚本,这些脚本可以在不同时间调用对话框。

我已经看到一个有趣的想法,建议使用JavaScript代码覆盖率工具来检测代码库。那里有多个JavaScript代码覆盖率选项,但是易于使用的浏览器扩展可以动态地检测代码,这似乎是理想的解决方案。 (另一个有趣的想法是使用代理服务器,例如http://siliconforks.com/jscoverage/manual.html;'jscoverage --server --proxy',但是我无法在几乎所有网站上使用它,除了硅叉网站本身之外)。有一个概念证明可供Chrome浏览器使用(http://googletesting.blogspot.ca/2011/10/scriptcover-makes-javascript-coverage.html),我认为这可能是帮助解决缓慢的脚本问题的一个很好的开端-如果可以为IE进行此类扩展。

因此,重申我的主要问题是,一个人可以使用哪些工具/进程来调试/分析出现在用户计算机上的慢脚本对话框?一个子问题是,是否有人知道可以重新用于帮助诊断IE中缓慢的脚本对话框的JavaScript代码分析工具,并且需要最少的部署工作?从理论上讲,能否编写IE扩展名,使其具有与Google脚本覆盖扩展名相同的代码覆盖率?

谢谢,

巴黎圣母院

最佳答案

在过去,JavaScript很少使用。页面对我来说更静态。如今,PC的功率越来越低,在服务器上运行复杂的任务变得越来越普遍。 JavaScript仅用于某些动画。

微软(以我的方式或没有方式)花了很多时间来确认大量JavaScript版本的内容。 (他们还喜欢IE8中的JScript)。在IE9之前,他们一直认为在脚本中运行> 5000万条指令是潜在的错误。

我不知道有什么工具可以检索指令计数。这是浏览器的内置功能。

但是大多数浏览器都检索函数的执行时间。我知道,在每台不同的计算机上,相同数量的指令可能花费不同的时间,但是您可以设置基准。

在计算机上运行包含5 000 000条指令的脚本,并查看运行多长时间。然后利用这段时间来测试其他JavaScript。它不是100%准确,但是一旦您弄弄它,它可能会变得接近。

由于旧的IE开发人员工具相当差,因此您可以使用一些第三方工具。这里的用法示例:
deep-tracing-of-internet-explorer

无论如何,“此页面上的脚本导致您的计算机运行缓慢...”仅是IE4-IE8中的问题。由于这些浏览器已过时,因此应该是这个问题。

关于javascript - 调试错误消息:“此页面上的脚本导致Internet Explorer运行缓慢”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22079893/

相关文章:

javascript - javascript 中未附加的匿名函数和双重命名方法?

javascript:显示隐藏文本适当的宽度

javascript - 通过 jQuery GET 调用传递参数在服务器端接收 null

performance - Angular2 性能,具有大量输入元素和双向绑定(bind)

python - Python 3 的枚举速度是否比 Python 2 慢?

javascript - 为什么 IE 在设置 innerHTML 时会出现意外错误

html - Typeface.js 在 Internet Explorer 中根本不呈现标题

javascript - 我的 Bootstrap 警报在关闭后不会显示

java - 用于几种类型请求的 JMX Bean

javascript - IE href ="javascript:customFunction()"未在第一帧加载时触发