RtlInitializeExceptionChain做了什么,如何减少其执行开销?

时间:2011-07-27 23:33:48

标签: c++ optimization com

我正试图在我的程序中找到瓶颈(目前处于“低悬的水果”阶段),并且使用分析器我得到如下内容:

Sleepy screenshot

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

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

谢谢!

4 个答案:

答案 0 :(得分:21)

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

如果您的应用程序是32位并且您在64位计算机上进行性能分析,则在32位计算机上进行性能分析或构建64位版本可能会将RtlInitializeExceptionChain从前10个列表中移出,因为它是总是用在thunking。

否则,几乎可以肯定你无能为力。

答案 1 :(得分:9)

我发现此页面搜索同样的问题,并认为我应该添加我的解决方案。

我发现了一个严重减速的应用程序,我使用分析器跟踪了这个功能。

原来我已经离开了一个VS条件断点,在这个断点上经常被测试但没有触发。删除断点修复了问题。

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:5)

如果选择“Profile All”[Threads]而不是“Profile Selected”[Threads],可能会在Very Sleepy探查器中发生这种情况。很容易就会出现大多数等待的线程,这会混合到性能分析结果中。我也被这几次抛出了。