【发布时间】:2014-02-27 20:42:35
【问题描述】:
我的一个用户在 IE 8 中间歇性地得到一个对话框,上面写着:
此页面上的脚本导致 Internet Explorer 运行缓慢
这个问题已经在 MSDN 论坛和网络上的其他地方多次报告。例如:
- 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 的调用;两者的语句数相同,但前者的执行速度比后者快,因此检查 %/raw time 不是很有用)。
我使用的一种有价值的方法是,当慢速脚本对话框出现时,在 IE 中启动调试器(如果尚未启动)并在调试器中选择 break 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 制作这样的扩展。
所以,重申一下我的主要问题是,可以使用哪些工具/流程来调试/分析出现在用户机器上的慢速脚本对话框?一个子问题是,是否有人知道任何 JavaScript 代码分析工具可以重新用于帮助诊断 IE 中的慢速脚本对话框,并且需要最少的部署工作?理论上是否可以编写一个 IE 扩展来实现与 Google 的脚本覆盖扩展一样的代码覆盖率?
谢谢,
巴黎
【问题讨论】:
-
嗯,没有人有时间阅读所有内容。阅读完所有内容后,您基本上是在要求一种工具,而这些问题通常会被关闭。
-
我很欣赏它很长,但我希望有人会花时间。我试图描述我已经完成的研究。
-
嗨@Notre你检查过任何JS分析器吗?看起来 firebug 和 chrome 开发者工具很适合开始。这篇文章可能会有所帮助:coding.smashingmagazine.com/2012/06/12/… 还有这个:getfirebug.com/javascript
-
嗨@artuc。是的,我做到了。问题是这些分析器将报告函数中使用的时间量,而不是执行了多少语句。 IE 关心的是语句的数量而不是时间(与其他查看时间的浏览器相比)。不过,总的来说,我是这些分析器的忠实粉丝。
标签: javascript performance internet-explorer