gpt4 book ai didi

winapi - WH_CALLWNDPROC 钩子(Hook)性能在 Win10 中是否显着下降(与 Win7 相比)?

转载 作者:行者123 更新时间:2023-12-04 15:45:19 24 4
gpt4 key购买 nike

我们正在将我们的工作站从 Win7 升级到 Win10。在调查性能下降的报告时,我得出结论,这是由第三方安装的 WH_CALLWNDPROC 钩子(Hook)引起的。

我根据以下测试应用程序的结果得出了这个结论(在 Delphi 10 Seattle 中完成)

procedure TForm3.Button1Click(Sender: TObject);
var
I: Integer;
SW : TStopWatch;
begin
sw := TStopWatch.StartNew;
for I := 0 to 1000000 do
begin
if Combobox1.ItemIndex > 0 then
Exit;
end;
sw.Stop;
ShowMessage(sw.ElapsedMilliseconds.ToString);
end;

(对于不熟悉 Delphi 的人,TStopwatch 使用 QueryPerformanceFrequency/QueryPerformanceCounter API 来获取耗时)

此方法的执行时间为
  • Win10:1485 毫秒
  • Win7:4996 毫秒

  • (注意:两台机器都在截然不同的硬件上,无法真正相互比较)。

    现在,如果我在执行相同的代码之前添加一个钩子(Hook)
    function MySystemWndProcHook(Code: Integer; wParam: WParam; lParam: LParam): LRESULT; stdcall;
    begin
    Result := CallNextHookEx(FHook, Code, wParam, LParam);
    end;

    procedure TForm3.FormCreate(Sender: TObject);
    begin
    FHook := SetWindowsHookEx(WH_CALLWNDPROC, @MySystemWndProcHook, 0, GetCurrentThreadId)
    end;

    执行时间现在变为:
  • Win10:19552 毫秒(大约长 1300%)
  • Win7:8682 毫秒(长约 75%)

  • 现在,正如我所提到的,两个工作站都在不同的硬件上,但我不相信仅凭这一点就可以解释这种差异。 Win10是i7 CPU,Win7是i3。如果有的话,我希望 i3 受到更大的打击(更少的缓存,更少的资源......)

    那么,自 Win7 以来,WH_CALLWNDPROC 钩子(Hook)是否变得慢得多?
    快速的谷歌搜索似乎没有发现关于这个问题的任何其他报告。有人可以重现我的结果吗?
    如果无法复制,任何人都知道是什么设置/冲突的应用程序可能导致这种情况? (已经尝试禁用 Windows Defender 实时扫描并且它没有影响性能)。

    编辑:这是在 Win10 1803 64 位下测试的。测试应用程序本身是 32 位的。

    EDIT2:以 64 位编译的相同应用程序提供以下执行时间。
  • Win10:780 毫秒/10201 毫秒。
  • Win7:6419 毫秒/9201 毫秒。

  • EDIT3:有趣的是,当以管理员身份运行应用程序(32 位)时:
  • Win10:12693 毫秒/18028 毫秒

  • 此外,(在另一个工作站上),以不同的用户身份运行会有所不同:
  • Win10(1809)/“标准用户”:9430/17440 毫秒
  • Win10(1809)/系统:5220/10160 毫秒(通过 PsExec 远程启动)

  • EDIT4:如果以管理员身份运行,应用程序从 USB key 运行将比从硬盘运行得更快。 (注意:到目前为止,我只在具有单个驱动器的系统上进行了测试。此时,我不排除只有操作系统驱动器较慢。)

    EDIT5:我发现了很多关于这种情况的事情。
    首先,运行“As Admin”(win10) 会导致应用程序安装一个 WH_CALLWNDPROCRET 钩子(Hook)。我还没有找到它的来源(操作系统、Delphi 的框架、其他应用程序?)。当简单地运行应用程序时,它绝对不存在。

    性能上的影响似乎并不在于钩子(Hook)本身,而是在于它对 SendMessage 的影响。

    我们正在与 Microsoft 的支持人员联系,他们已经重现了类似的结果(在 100k 循环而不是 1m 上):
  • Windows 7 - 没有钩子(Hook) 0.018396 秒。
  • Windows 10 - 没有钩子(Hook) 0.025102 秒。
  • Windows 7 - 带钩子(Hook) 0.167941 秒。
  • Windows 10 - 带钩子(Hook) 1.105929 秒。

  • (调查仍在进行中,所以目前还没有结论)

    这些结果还表明,我们的许多工作站在不涉及 Hook 时的性能都比应有的差。

    最佳答案

    因此,WH_CALLWNDPROC 和 WH_CALLWNDPROCRET 钩子(Hook)确实会大大降低性能。在 Win10 中比在 Win7 中更是如此。

    部分性能损失来自 Spectre 和 Meltdown 的缓解代码。 Microsoft 的早期报告表明,其余部分显然来自窗口管理器 (win32k*.sys) 中的锁争用。

    至于我在调查中得到的奇怪结果:

  • 运行“以管理员身份”导致在我的应用程序中安装了一个额外的钩子(Hook),这解释了我目睹的大规模减速
  • 我所做的许多测试都是在通过远程管理工具访问的测试机器上进行的……这恰好安装了全局 WH_CALLWNDPROC/WH_CALLWNDPROCRET 钩子(Hook)本身,这使我的测试结果存在缺陷。在本地运行“修复”了结果。我花了一段时间才找到它,因为我的应用程序是 32 位的,钩子(Hook)是 64 位的,所以我的应用程序没有收到通知(但仍然会导致性能下降)。

  • 2020-02-04:我刚刚收到来自 Microsoft 的更新。他们的工程师确定了一些导致性能下降的问题。包含修复程序的 Windows Insider 版本的当前估计是 2020H1,2020H2 早期

    关于winapi - WH_CALLWNDPROC 钩子(Hook)性能在 Win10 中是否显着下降(与 Win7 相比)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56027264/

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