3

我创建了一个简单的控制台应用程序并通过运行命令从 PerfView 执行它 -> PerfMonTest.exe

我得到日志文件并查看应用程序的进程。正如预期的那样昂贵(99% CPU),但是当我想深入研究昂贵的方法时,它们不会显示在昂贵的方法列表中。

我能做些什么让它们可见吗?

这是我选择流程时的视图。我希望列表中有 CallExpensive 和 CallCheap:

在此处输入图像描述

选择主要方法并没有让我有机会进一步研究被调用的方法

在此处输入图像描述

这是应用程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PerfMonTest
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i <= 2000; i++)
            {
                CallExpensive(1000);
                CallCheap(1000);
                CallCheap(400);
            }

        }

        public static void CallExpensive(int expense)
        {
            for (int i = 0; i <= expense; i++)
            {
                DateTime checkTime = DateTime.Now;
                string val = "10" + i.ToString();
            }
        }

        public static void CallCheap(int expense)
        {
            for (int i = 0; i <= expense; i++)
            {
                int j = 2;
            }
        }
    }
}
4

1 回答 1

5

从屏幕截图看起来,您没有加载符号。如果你这样做,你会发现大部分时间都花在了DateTime.Now.

如果您MainBy Name视图中单击,您将转到Callers视图,它会告诉您哪些方法调用了Main. 如果您想深入了解Main正在调用的方法,您需要转到Callees视图。Main如果你这样做,你会看到调用的分解。

但是,在这种特殊情况下,CallExpensiveand的逻辑CallCheap非常简单,以至于方法将被内联(在发布模式下)。因为方法是内联的,所以它们不会作为调用的一部分出现,Main因为代码已经折叠到Main自身中。

您可以通过在方法运行后附加调试器来验证方法是否已内联,并查看该类型的方法描述符。这是我得到的输出:

0:004> !dumpmt -md 004737c0
EE类:00471278
模块:00472e94
名称:ConsoleApplication1.Program
mdToken:02000002
文件:C:\temp\ConsoleApplication1\ConsoleApplication1\bin\Release\ConsoleApplication1.exe
基数:0xc
组件大小:0x0
VTable 中的插槽:8
IFaceMap 中的 IFace 数量:0
--------------------------------------
方法描述表
   输入方法De JIT 名称
72064a00 71d66728 PreJIT System.Object.ToString()
72058830 71d66730 PreJIT System.Object.Equals(System.Object)
72058400 71d66750 PreJIT System.Object.GetHashCode()
72051790 71d66764 PreJIT System.Object.Finalize()
0047c01d 004737b8 无 ConsoleApplication1.Program..ctor()
004d0050 00473794 JIT ConsoleApplication1.Program.Main(System.String[])
0047c015 004737a0 无 ConsoleApplication1.Program.CallExpensive(Int32)
0047c019 004737ac 无 ConsoleApplication1.Program.CallCheap(Int32)

并列在 JIT 列中的事实表明它们是内联的(或根本没有调用,但这里不是这种CallExpensive情况)CallCheapNONE

于 2013-04-05T17:17:59.803 回答