我的一位用户间歇性地在IE 8中获得了一个对话框:
此页面上的脚本导致Internet Explorer运行缓慢
在MSDN论坛和网络上的其他地方已多次报告此问题。例如:
所以,这个问题与那些和其他许多问题重复。但这是故意重复,因为我认为这些问题中的任何一个都没有以帮助用户(开发人员)确切地确定其场景中的内容导致对话框出现的方式得到回答。
我知道基于这个页面:
http://support.microsoft.com/kb/175500
当新脚本开始执行(通过各种方式)后执行了一定数量的语句时,会出现对话框。默认情况下,语句数为5,000,000,但可以通过注册表项进行配置。
这个问题的一般处方是:
的组合所以,我理解一般来说问题是什么,并且我理解了解决问题的方法,一般来说也是如此。问题是,如何确定代码的哪些区域导致对话框出现给特定用户?通常这个问题出现在一个非常大的代码库(包括第三方库)中,所以在没有一些工具支持的情况下手动审查代码库是不可行的。
大多数浏览器(包括IE8及更高版本)都具有分析工具,使开发人员能够确定JavaScript CPU使用率。除IE之外,其他浏览器决定脚本长时间运行不是基于执行的语句数,而是基于脚本执行的时间。为此,浏览器中可用的(或作为附加组件)的分析器可以识别执行函数所花费的百分比和通常的原始时间,包括函数和包含函数,并且可以相应地对结果进行排序。 IE的分析器还会给你一个函数调用频率的计数。这些分析器都不会告诉您在分析期间执行了多少函数语句;它们只告诉你在函数中花了多长时间以及调用函数的次数。这对IE的慢脚本对话逻辑没有帮助,该逻辑基于执行的语句(而不是时间)的数量。执行函数所花费的时间和语句数之间有时会有相关性,但它不是可靠的关系,因为不同类型的语句执行时间可能会有很大不同(例如,许多本机JavaScript函数比更新DOM的调用;两者都有相同的语句计数,但前者的执行速度比后者快,这使得检查%/ raw时间不是很有用。)
我使用过的有一些价值的方法是当出现慢脚本对话框时,在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的脚本封面扩展一样编写代码覆盖范围?
谢谢,
巴黎
答案 0 :(得分:0)
在过去,JavaScript并没有那么多使用。对我来说,页面更加静态。目前,PC的功耗较低,在服务器上运行复杂任务更受欢迎。 JavaScript仅用于某些动画。
微软(我的方式或没办法)花时间承认JavaScript内容很多。 (他们也在IE8中摆弄他们的JScript)。直到IE9,他们才考虑运行>脚本中的5 000 000条指令是一个潜在的错误。
我不知道有任何工具可以检索指令数。这是一个浏览器内置功能。</ p>
但是大多数浏览器都会检索函数的执行时间。我知道在每台不同的计算机上,相同数量的指令可能需要不同的时间,但您可以设置基准。
在机器上运行带有5 000 000条指令的脚本,并查看运行所需的时间。然后用这段时间来测试你的其他JavaScript。它不是100%准确,但一旦你摆弄它就会变得很接近。
由于旧的IE开发人员工具很差,您可以使用某些第三方工具。这里的一个例子: deep-tracing-of-internet-explorer
无论如何,“此页面上的脚本导致计算机运行缓慢......”只是 IE4 - IE8 中的一个问题。由于这些浏览器已过时,因此这个问题应该是。