2012-07-23 64 views
0

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

什么是UMThunkStubAMD64?有没有影响其性能的因素?

+1

UMThunkStubAMD64是一个处理从本机到托管代码转换的thunk。这是25%_inclusive_还是_exclusive_时间?包含的数字可能包括执行托管代码的所有时间。 – 2012-07-23 18:18:29

+0

这是_exclusive_时间。将更新问题 - 谢谢。 – xan 2012-07-23 18:31:57

+0

这个函数的总点击次数是多少,执行该函数的平均持续时间是多少? – 2012-07-23 18:43:26

回答

1

UMThunkStubAMD64是一个thunk,用于处理从本机到托管代码的转换。

如果25%的样本都在这个thunk中,那么剖析器很可能只是分析本机代码。如果是这样,当托管代码执行时所采用的任何样本都将显示在堆栈中最后一个本地框架的桶中,这将是本地托管的thunk。因此,25%将意味着(大约)25%的运行时间用于执行托管代码。

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