Performance TWebBrowser控件仅在Delphi中性能较慢

Performance TWebBrowser控件仅在Delphi中性能较慢,performance,delphi,twebbrowser,Performance,Delphi,Twebbrowser,有人能解释一下为什么TWebBrowser控件在Delphi的所有XE版本上工作得如此缓慢,包括XE5和XE6吗?要测试这一点,您需要创建一个新的Delphi项目,并将TWebBrowser控件放入其中。在form show事件中,导航到此网站: 请在Windows 7或更高版本上进行测试。导航完成后,运行setImmediate test并观察结果。完成测试将花费大量时间。完成这项工作大约需要一分钟 当您打开真正的Internet Explorer浏览器并执行相同的操作时,测试将立即完成(约

有人能解释一下为什么TWebBrowser控件在Delphi的所有XE版本上工作得如此缓慢,包括XE5和XE6吗?要测试这一点,您需要创建一个新的Delphi项目,并将TWebBrowser控件放入其中。在form show事件中,导航到此网站:

请在Windows 7或更高版本上进行测试。导航完成后,运行setImmediate test并观察结果。完成测试将花费大量时间。完成这项工作大约需要一分钟

当您打开真正的Internet Explorer浏览器并执行相同的操作时,测试将立即完成(约200毫秒)

一些额外的wierd信息:

当您在旧版本的Delphi(确切地说是Delphi 7)上重新创建此过程时,web控件的工作速度与它应该工作的速度一样快,测试立即完成。但是HTML5的速度测试仍然很慢(本页的替代测试)

另一个奇怪的事情是,在C++ Builder上可以看到同样的慢行为,但在VisualStudio产品中却看不到同样的行为。微软是否有意放慢Embarcadero产品中的TWebBorwser速度??真不敢相信

我试图用不同的方法来解决这个问题,例如:

  • 正在尝试注册表中的不同功能选项,例如: 功能\GPU\U渲染, 功能浏览器模拟(11001), 功能对齐定时器(未记录选项), 功能允许高频定时器(未记录选项)

  • 设置timerBeginPeriod(1)-无效

  • 请,如果有人有任何线索如何解决这个问题-与我分享这些信息

    更新1
    如果有人在乎的话,我做了一个独立的测试应用。它可以在这里下载:它包含源代码和带有htm文件的exe应用程序。HTM文件包含一些js过程,在独立IE中的运行速度是TWebBrowser控件的10倍。它使用setImmediate作为测试(与上述测试中使用的程序相同)。但是这样做更容易测试。

    我也可以看到所描述的行为(在您的原始帖子和评论中)。我有一些想法,但不一定有答案

    人们应该期望WebBrowser控件和IE在性能上有所不同,部分原因是您的Delphi应用程序需要内置对IE开箱即用支持的某些功能/API的支持

    例如,WebBrowser控件触发与(旧的但相关的)相关的通知,但它本质上不处理这些通知或更新UI。您必须响应通知并自己绘制选项卡。默认情况下,IE是硬件加速的,并且使用某些Windows API,这些API可能不受Delphi的VCL(出于资源/性能)的直接支持。(硬件加速可以解释您注意到的一些性能差异。)

    (而且,为了记录在案,我不相信IE和WebBrowser控件之间的差异列表被记录在案。我当然不记得在投资组合中看到过这样的差异。)

    此外,各种功能控件的默认值在IE和承载WebBrowser控件的应用程序之间有所不同。部分原因在于IE需要强调性能而不是兼容性,而应用程序通常需要强调兼容性而不是性能。您可能希望查看,以查看是否需要为您的应用启用其他FCK

    第二,你的环很紧,也许太紧了。您有一个请求堆积在早期的请求上,并且您实际上没有留下太多的处理空间,即使使用setImmediate。(IIRC,我们实际上不应该在setInterval中使用小于250ms的任何值,而不会因为请求的数量而影响性能。)参考页中的注释提供了一些指导,本文也提供了一些指导

    拖动窗口似乎可以提高性能的一个原因可能是由于窗口拖动重新绘制请求的优先级。它们可能会迫使循环保持足够长的时间(甚至中断),以允许其他事件处理。如果不使用调试器跟踪系统,很难说

    您是否曾经需要将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工具调试器报告的语法错误。)

    这里有几个风格要点:

    • 我使用了一个按钮来加载Internet区域中的页面。我发现这样可以更容易地以边缘模式加载页面,因为默认情况下,intranet区域中的页面是在兼容性视图中加载的(除非您以不同的方式映射区域)

    • 与x-ua兼容的标头需要是标头块中的第一个标头之一。它可以跟在标题后面,但是

    • 在风格上,现在的元素需要用小写字母来表示。有一种可能性是,如果不遵循约定,解析器可能会退回到支持约定的早期呈现

    一旦我能够在运行时控制documentMode,我发现了我所期望的结果:旧的文档模式运行得更慢。我还发现,使用requestAnimationFrame而不是setImmediate可以获得更好的性能,但同时也暴露了t