gpt4 book ai didi

performance - TWebBrowser 仅在 Delphi 中控制性能缓慢

转载 作者:行者123 更新时间:2023-12-03 14:54:37 25 4
gpt4 key购买 nike

有人能解释一下为什么 TWebBrowser 控件在 Delphi 的所有 XE 版本(包括 XE5 和可能的 XE6)上运行如此缓慢?要对此进行测试,您需要创建一个新的 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) - 无效。

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

    更新 1
    如果有人关心,我制作了独立的测试应用程序。可以在这里下载: http://mp.org.pl/download/ietest.zip它包含带有 htm 文件的源代码和 exe 应用程序。 HTM 文件包含一些 js 程序,其在独立 IE 中的运行速度比在 TWebBrowser 控件中快 10 倍。它使用 setImmediate 作为测试(与上述测试中使用的过程相同)。但是以这种方式进行测试会更容易。

    最佳答案

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

    人们应该预料到 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 使用任何小于 250 毫秒的时间,而不会有因请求数量过多而导致性能下降的风险。) 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 区域中的页面在兼容性 View 中加载(除非您以不同方式映射区域)。
  • x-ua-compatible header 需要是 head 块中的第一个。它可以跟随标题,但 not much else .
  • 在风格上,这些天元素需要以小写形式指定。有可能不关注 current conventions强制解析器回退到支持约定的较早渲染。

  • 一旦我能够在运行时控制 documentMode,我就发现了预期的结果:旧文档模式运行得更慢。我还发现使用 requestAnimationFrame 而不是 setImmediate 会带来更好的性能,但也几乎立即浮出水面计时问题。

    最后,这可能是测试突出问题的情况,但不一定是您要解决的问题。 (在此处插入 Inigo meme。)我知道您正在尝试解决瓶颈问题。您确定找到了正确的瓶颈吗?

    您可能无法复制 native 浏览器的相同性能,但也许您可以重构代码以充分执行而无需额外开销?有什么可以用 worker 更好地处理的吗?或其他一些实现技术?

    希望这可以帮助...

    关于performance - TWebBrowser 仅在 Delphi 中控制性能缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24994040/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com