C# 什么是UMThunkStubAMD64?为什么它看起来是一个瓶颈?

C# 什么是UMThunkStubAMD64?为什么它看起来是一个瓶颈?,c#,c++,windows,C#,C++,Windows,我正在Windows WPF C++/C#64位应用程序中搜索性能问题。在调试器下运行(包括使用调试堆运行)时,应用程序有时会非常慢,每次单击都需要几秒钟的响应时间。在缓慢期间,MSVS探查器将UMThunkStubAMD64报告为完成最多工作的函数(25%独占样本)。这个名字听起来像是某种适配器/包装器函数,可能是为了从64位应用程序代码调用32位操作系统代码,但我想知道它是否做了更多的工作,比如检查堆状态 什么是UMThunkStubAMD64?是否有任何因素影响其性能 UMThunkStu

我正在Windows WPF C++/C#64位应用程序中搜索性能问题。在调试器下运行(包括使用调试堆运行)时,应用程序有时会非常慢,每次单击都需要几秒钟的响应时间。在缓慢期间,MSVS探查器将UMThunkStubAMD64报告为完成最多工作的函数(25%独占样本)。这个名字听起来像是某种适配器/包装器函数,可能是为了从64位应用程序代码调用32位操作系统代码,但我想知道它是否做了更多的工作,比如检查堆状态


什么是UMThunkStubAMD64?是否有任何因素影响其性能

UMThunkStubAMD64
是一种处理从本机代码到托管代码转换的thunk

如果25%的样本在此thunk中,那么探查器可能只是在分析本机代码。如果是这样,则在执行托管代码时采集的任何样本都将显示在堆栈上最后一个本机帧的bucket中,这将是托管thunk的本机帧。因此,25%意味着(大约)25%的运行时间用于执行托管代码


thunk本身应该非常快:在本机代码和托管代码之间进行转换不是免费的,但是一个程序也不应该花费25%的时间。可能会想出一个花费大量时间进行转换的人为示例,但我想在实际代码中不太可能遇到这种情况。

UMThunkStubAMD64是一个处理从本机代码到托管代码转换的thunk。这是25%的包含时间还是独占时间?包含的数字可能包括执行托管代码所花费的所有时间。这是独占时间。将更新问题--谢谢。此函数的总命中率是多少?执行此函数的平均持续时间是多少?@James它是一个采样分析器,不提供该信息。当我尝试使用clock()手动测量它时,操作系统调用(例如,文本绘制)可能需要0毫秒(正常模式)或6毫秒以上(慢速模式),包括在内。您可能只是分析本机代码吗?如果是这样的话,这就可以解释这种行为:所有托管帧都会集中到堆栈上最低的本机帧中,这就是这个thunk。或者,考虑对二进制进行检测(VisualStudio DePrror确实支持测试)。