【发布时间】:2019-12-28 02:52:05
【问题描述】:
在 Visual Studio 中 - 有没有办法分析在 .NET Framework 的内部方法中花费的时间?
一个例子 - 考虑一个老式的ArrayList,并向它添加一些随机数:
static void Main(string[] args)
{
const int noNumbers = 10000; // 10k
ArrayList numbers = new ArrayList();
Random random = new Random(1); // use the same seed as to make
// benchmarking consistent
for (int i = 0; i < noNumbers; i++)
{
int currentNumber = random.Next(10); // generate a non-negative
// random number less than 10
numbers.Add(currentNumber); // BOXING occurs here
}
}
我可以在调试时直接进入 .NET Framework 源代码。可以使用默认的 Microsoft 符号和 .NET 的源代码(如 this answer 中所述)或使用 dotPeek 路线(详细 here)。至于仅使用参考源符号的最简洁的选择——正如 Hans Passant 大约 5 年前在his answer 中所说的那样——创建符号的框架版本(直至安装的安全更新)必须与您的版本;您必须非常幸运才能使其正常工作(我没有)。底线 - 我可以成功使用 2 种方法来进入 .NET 源代码。
对于手头的示例,参考源代码和 dotPeek 逆向工程代码之间没有太大区别——即ArrayList 的Add 调用的方法——即Capacity setter和ArrayList的EnsureCapacity,其中后者如下图(左侧为ReferenceSource代码,右侧为dotPeek源代码):
运行“Instrumentation”分析会话将返回每个方法所用时间的细分,但只要 .NET 类型存在,似乎只能看到相应代码“直接”调用的方法 -在这种情况下,将Adds 元素添加到ArrayList 的函数、生成Random int 的函数以及相应类型的构造函数。但是没有EnsureCapacity 或Capacity 的setter 的踪迹,它们都被ArrayList 的Add 大量调用。
深入研究特定的 .NET 方法不会显示它依次调用的任何方法,也不会显示任何源代码(尽管在使用调试器时能够更早地看到该代码):
如何才能看到那些额外的“内部”.NET 方法?如果 Visual Studio 做不到,也许其他工具可以?
PS 有一个非常相似的问题here,但是它已经有将近 10 年的历史了,并没有太多可以说明问题的地方。
【问题讨论】:
-
您尝试过 DotTrace 吗?我刚刚检查过,它可以做到(计算时间和 set_Capacity 的总调用次数)
-
好点!问题已更新。我仍然想知道为什么 Visual Studio 做不到。
-
抱歉没试过 VS profiler 所以帮不上忙
标签: c# .net visual-studio profiling