RtlInitializeExceptionChain是什么,如何降低其执行开销?

23

我正在尝试找到程序的瓶颈(目前处于“低垂果实”阶段),并使用分析器得到以下结果:

Sleepy screenshot

从中可以看出,RtlInitializeExceptionChain占用了大部分时间,而我的实际程序函数甚至没有进入此列表。 我想知道是否有人知道RtlInitializeExceptionChain是什么,如何调用它以及我如何重新组织我的程序以避免频繁调用它?

关于我的项目的其他信息:它是一个使用ATL的COM API,并且正在对消耗此API的“测试”C ++程序进行性能分析。

谢谢!


RtlInitializeExceptionChain()几乎肯定是操作系统使用的内部函数。这可能意味着它是一个实现细节,不应该被修改。鉴于它是一个初始化函数,除非您在紧密循环的每个迭代中调用它,否则我认为不必担心。 - In silico
RtlInitializeExceptionChain 的典型调用堆栈是什么? - Martyn Lovell
4个回答

20

RtlInitializeExceptionChain是运行时库中的一个内部函数,它是一组内核模式支持函数,被用于内核模式驱动程序和操作系统本身。这个函数可以看作是C运行时库的内核模式版本。

如果您的应用程序是32位的,并且在64位机器上进行性能分析,那么在32位机器上进行性能分析或者建立64位版本可能会将RtlInitializeExceptionChain从前10个列表中移除,因为它总是在转发过程中使用。

否则,您几乎肯定无法对此进行任何处理。


我正在进行的就是对64位系统上的32位应用程序进行性能分析!不幸的是,由于库依赖关系,我无法将程序重建为64位版本,但我会尝试找一台32位机器来进行性能分析。谢谢! - fyhuang

9
我通过谷歌搜索发现这个页面,跟着思路找到了解决方案。
我发现一个应用程序出现了严重的减速问题,通过分析器追踪之后,发现是由于这个函数引起的。后来发现我留下了一个VS条件断点,虽然没有触发但却一直在被测试。移除这个断点后问题得以解决。

哇,你的回答让我开心了一整天。我从来没有想过会有这个方向! - chris LB

5
在Very Sleepy分析器中,如果选择“Profile All” [Threads]而不是“Profile Selected”[Threads],就会出现这种情况。有些线程可能正在大部分时间内等待,而这些等待时间也会混入分析结果中。我也曾多次被此问题困扰过。

5
据我所知,每次创建线程时都会调用RtlInitializeExceptionChain函数作为其初始化的一部分。该函数为线程设置了SEH。
由于它在时间上似乎是昂贵的(不确定为什么,因为它似乎没有做太多事情),请确认您的应用程序中有许多线程,并尝试看是否可以减少线程的数量,同时仍然完成它需要做的工作。
无论如何,这是一个内部于操作系统的功能,除了它将参与开发人员启动的线程的初始化外,开发人员不能直接控制它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接