有人可以解释为什么TWebBrowser控件在包括XE5和可能的XE6在内的所有适用于Delphi的XE版本上运行速度如此之慢?要测试这个,你需要创建一个新的Delphi项目并将TWebBrowser控件放入其中。在表单显示事件中,导航到此网站:
http://ie.microsoft.com/testdrive/Performance/setImmediateSorting/Default.html
请在Windows 7或更高版本上测试。导航完成后,运行setImmediate test并观察结果。完成测试需要花费大量时间。完成此操作大约需要一分钟。
当您打开真正的Internet Explorer浏览器并执行相同操作时 - 测试将立即完成(约200毫秒)。
一些额外的奇怪信息:
当您在旧版本的Delphi(准确地说是Delphi 7)上重新创建此过程时,Web控件的工作速度应尽可能快,并且测试立即完成。但是HTML5速度测试仍然会很慢(在此页面上进行替代测试)。
另一个奇怪的事情是,在C ++ Builder中可以看到相同的慢行为,但在Visual Studio产品中却看不到。微软是否故意放慢Embarcadero产品中的TWebBorwser?我无法相信这一点。
我试图用不同的方法克服这个问题,例如:
在注册表中尝试不同的功能选项,例如: FEATURE_GPU_RENDERING, FEATURE_BROWSER_EMULATION(11001), FEATURE_ALIGNED_TIMERS(未记录的选项), FEATURE_ALLOW_HIGHFREQ_TIMER(未记录的选项),
设置timerBeginPeriod(1) - 无效。
如果有人知道如何解决此问题,请与我分享此信息。
UPDATE1 如果有人关心,我制作了独立的测试应用程序。它可以在这里下载:http://mp.org.pl/download/ietest.zip它包含带有htm文件的source和exe应用程序。 HTM文件包含一些js过程,它在独立IE中比在TWebBrowser控件中快10倍。它使用setImmediate作为测试(与上述测试中使用的相同的过程)。但是以这种方式测试会更容易。
答案 0 :(得分:1)
我还可以看到所描述的行为(在您的原始帖子和评论中)。我有一些想法,但不一定是答案。
人们应该期待WebBrowser控件和IE之间的性能存在一些差异,部分原因是因为您的Delphi应用程序需要构建支持IE支持开箱即用的某些功能/ API。
例如,WebBrowser控件会触发与tabbed browsing相关的通知(旧的,但相关),但它本身并不处理这些通知或更新UI。您必须自己回复通知并绘制标签。默认情况下,IE是硬件加速的,并使用Delphi的VCL(资源/性能)可能无法直接支持的某些Windows API。 (硬件加速可以解释您注意到的一些性能差异。)
(并且,为了记录,我不相信IE和WebBrowser控件之间的差异列表有记录。我当然不记得在投资组合中看到一个。)
此外,各种功能控件的默认值因IE和托管WebBrowser控件的应用程序而异。部分原因在于IE需要强调性能而非兼容性,而应用程序通常需要强调兼容性而不是性能。您可以查看feature control reference以查看是否还需要为您的应用启用其他FCK。
其次,你的环很紧,也许太紧了。你有一个请求堆积在先前的请求上,即使使用setImmediate,你也没有留下太多的处理空间。 (IIRC,对于setInterval,我们不应该使用小于250ms的任何东西,而不会因为大量请求而导致性能下降。)setImmdiate参考中的评论。页面提供了一些指导,就像requestAnimationFrame上的这篇文章一样。
拖动窗口似乎可以提高性能的一个原因可能是窗口拖动重绘请求的优先级。它们可能会强制您的循环保持足够长(甚至中断)以允许其他事件处理。很难说没有使用调试器跟踪系统。
您是否曾经将application.processMessages()添加到您的Delphi应用程序中,以便系统有机会处理您已分配的工作?考虑到测试的性质,类似的需求可能会发挥作用。
性能测试和时序是一件棘手的事情。您需要确保测试不会产生太大的开销,从而干扰您尝试执行的实际工作。
最后,有一些关于页面文档模式的问题,因为它已加载到您的项目中。当我第一次开始搞乱你的样本时,我无法让project4在IE5怪异模式以外的任何东西中加载slowtest.html(出了名的慢)。以下是最终开始为我工作的内容:
<!DOCTYPE html>
<!-- saved from url=(0023)http://www.contoso.com/ -->
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<script type="text/javascript">
...
(注意,我删除了您的初始doctype声明并重写它以解决F12工具调试器报告的语法错误。)
这里有一些风格要点:
我使用mark of the web加载Internet区域中的页面。我发现这样可以更容易地以边缘模式加载页面,因为默认情况下会在兼容性视图中加载Intranet区域中的页面(除非您以不同方式映射区域)。
x-ua兼容标头需要是头块中的第一个。它可以跟随标题,但是not much else。
从风格上讲,这些天需要以小写字母指定元素。有可能不遵循current conventions强制解析器回退到支持约定的早期渲染。
一旦我能够在运行时控制documentMode,我就找到了我期望的结果:旧的文档模式运行得更慢。我还发现使用requestAnimationFrame而不是setImmediate会带来更好的性能,但几乎可以立即浮现时间问题。
最后,这可能是测试突出显示问题的情况,但不一定是您尝试解决的问题。 (在这里插入Inigo meme。)我知道你正试图解决瓶颈问题。你确定你找到了正确的瓶颈吗?
您可能无法复制本机浏览器的相同性能,但也许您可以重构代码以在没有额外开销的情况下充分执行?使用worker或其他一些实现技术可以更好地处理任何事情吗?
希望这会有所帮助......