【问题标题】:Profile Time Spent in the Inner .NET Framework Methods在内部 .NET Framework 方法中花费的分析时间
【发布时间】: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 逆向工程代码之间没有太大区别——即ArrayListAdd 调用的方法——即Capacity setter和ArrayListEnsureCapacity,其中后者如下图(左侧为ReferenceSource代码,右侧为dotPeek源代码):

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

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

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

PS 有一个非常相似的问题here,但是它已经有将近 10 年的历史了,并没有太多可以说明问题的地方。

稍后更新:正如 KolA 很好指出的那样,JetBrains dotTrace 可以证明这一点。下面的逐行分析会话:

【问题讨论】:

  • 您尝试过 DotTrace 吗?我刚刚检查过,它可以做到(计算时间和 set_Capacity 的总调用次数)
  • 好点!问题已更新。我仍然想知道为什么 Visual Studio 做不到。
  • 抱歉没试过 VS profiler 所以帮不上忙

标签: c# .net visual-studio profiling


【解决方案1】:

也许其他工具可以?

DotTrace 可以根据您的需要将性能分析到属性。此示例适用于通用 List&lt;T&gt; 而不是 ArrayList 但我认为这无关紧要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2015-12-11
    • 2011-05-08
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2010-11-06
    相关资源
    最近更新 更多