gpt4 book ai didi

c# - 分析内部 .NET Framework 方法所花费的时间

转载 作者:行者123 更新时间:2023-11-30 22:53:05 25 4
gpt4 key购买 nike

在 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 在 his answer 中所说的那样大约 5 年前 - 为其创建符号的框架版本(直至安装的安全更新)必须与您的版本完全匹配;你必须非常幸运才能让它工作(我不是)。底线 - 我可以通过两种方式成功进入 .NET 源代码。

对于手头的示例,引用源代码和 dotPeek 逆向工程代码之间没有太大区别 - 这是针对 ArrayListAdd< 调用的方法 - 即 Capacity setter 和 ArrayListEnsureCapacity,后者可以在下面看到(ReferenceSource 代码在左边, dotPeek 源代码在右边):

enter image description here

运行“Instrumentation”分析 session 将返回每个方法所花费时间的细目分类,但只要 .NET 类型出现,似乎只能看到相应代码“直接”调用的方法 -在这种情况下,将 Add 元素添加到 ArrayList 的函数,生成 Random int 的函数,以及相应类型的构造函数。但是没有 EnsureCapacityCapacity 的 setter 的痕迹,它们都被 ArrayListAdd 大量调用.

enter image description here

向下钻取特定的 .NET 方法不会显示它依次调用的任何方法,也不会显示任何源代码(尽管能够更早地看到该代码,同时使用调试器进入):

enter image description here

如何才能看到那些额外的“内部”.NET 方法?如果 Visual Studio 做不到,或许其他工具可以?

PS 有个很相似的问题here ,但是它已经有将近 10 年的历史了,并且没有多少东西可以解决这个问题。

稍后更新:正如 KolA 很好地指出的那样,JetBrains dotTrace 可以显示这一点。以下是逐行分析 session : enter image description here

最佳答案

perhaps another tool can ?

如果您需要的话,DotTrace 可以将性能分析到属性。此示例适用于通用 List<T>不是 ArrayList但我认为这应该无关紧要。

enter image description here

关于c# - 分析内部 .NET Framework 方法所花费的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57615121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com