【问题标题】:What does RtlInitializeExceptionChain do, and how can I reduce its execution overhead?RtlInitializeExceptionChain 做了什么,如何减少它的执行开销?
【发布时间】:2011-10-14 17:08:27
【问题描述】:

我正在尝试在我的程序中找到瓶颈(目前处于“唾手可得”的阶段),并使用分析器得到如下结果:

我在这里看到的是 RtlInitializeExceptionChain 占用了大部分时间,而我实际程序中的函数甚至没有进入这个顶级列表。我想知道是否有人知道 RtlInitializeExceptionChain 是做什么的,它是如何被调用的,以及我如何重新组织我的程序以减少调用它的次数?

关于我的项目的一些其他信息:它是一个使用 ATL 的 COM API,被分析的程序是一个使用这个 API 的“测试”C++ 程序。

谢谢!

【问题讨论】:

  • RtlInitializeExceptionChain() 几乎可以肯定是操作系统使用的内部函数。这可能意味着它是一个实现细节,是你不应该混淆的东西。看到它是一个初始化函数,我认为除非您在紧密循环的每次迭代中都调用它,否则无需担心。
  • RtlInitializeExceptionChain 的典型调用堆栈是什么?

标签: c++ optimization com


【解决方案1】:

RtlInitializeExceptionChain 是运行时库中的一个内部函数,是内核模式驱动程序和操作系统本身使用的内核模式支持函数的集合。它是 C 运行时库的内核模式版本。

如果您的应用程序是 32 位的,并且您在 64 位机器上对其进行分析,那么在 32 位机器上对其进行分析或构建 64 位版本可能会将 RtlInitializeExceptionChain 移出前 10 名,因为它是总是用于 thunking。

否则,您几乎肯定无能为力。

【讨论】:

  • 那——在 64 位上分析 32 位应用程序——正是我正在做的事情!不幸的是,由于库依赖关系,我无法在 64 位版本中重建程序,但我会尝试找到一个 32 位机器进行分析。谢谢!
【解决方案2】:

我发现这个页面在谷歌上搜索了同样的问题,并认为我应该添加我的解决方案。

我发现一个应用程序严重减速,我使用分析器跟踪到这个函数。

原来我留下了一个 VS 条件断点,在该断点上不断测试但没有触发。删除断点解决了这个问题。

【讨论】:

  • 哇,你的回答让我很开心。我从来没有想过这个方向!
【解决方案3】:

据我所知,RtlInitializeExceptionChain 会为每个创建的线程调用一次,作为其初始化的一部分。该函数为线程设置 SEH。

由于它在时间上看起来很昂贵(不知道为什么,因为它似乎没有做太多),请确认您的应用程序中是否有很多线程,并可能看看您是否可以减少线程数同时仍在做它需要做的事情。

无论哪种方式,这是一个操作系统内部的函数,它不受开发人员的直接控制,除了它将参与开发人员已启动的线程的初始化这一事实。

【讨论】:

    【解决方案4】:

    如果选择“Profile All”[Threads] 而不是“Profile Selected”[Threads],这可能会发生在 Very Sleepy 分析器中。很容易有线程大部分时间都在等待,这会混入分析结果中。我也被这个扔了几次。

    【讨论】:

      猜你喜欢
      • 2014-04-10
      • 2014-03-05
      • 1970-01-01
      • 2010-11-21
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      相关资源
      最近更新 更多