我怎么能看到我在PerfView昂贵的方法(How can I see me expensive m

2019-09-23 22:29发布

我创建了一个简单的控制台应用程序,并通过运行命令从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;
            }
        }
    }
}

Answer 1:

从它看起来像截图,你没有加载符号。 如果你这样做,你会看到,大部分的时间都花在DateTime.Now

如果你点击Main用名字来看,你会去到主叫方看来,这其中的方法被称为会告诉你Main 。 如果你想钻到什么方法Main是打电话,你需要去到被调用者视图。 如果你这样做,你会看到破发的什么下跌Main要求。

然而,在此特定情况下的逻辑CallExpensiveCallCheap是如此简单,该方法将被内联的(在释放模式)。 由于该方法是内联,他们似乎没有从发出的呼吁的一部分, Main的代码已被折叠成Main本身。

您可以验证该方法是通过附加一个调试器的方法已经运行并查看类型的方法来描述后内联。 下面是我得到的输出:

0:004> !dumpmt -md 004737c0
EEClass:         00471278
Module:          00472e94
Name:            ConsoleApplication1.Program
mdToken:         02000002
File:            C:\temp\ConsoleApplication1\ConsoleApplication1\bin\Release\ConsoleApplication1.exe
BaseSize:        0xc
ComponentSize:   0x0
Slots in VTable: 8
Number of IFaces in IFaceMap: 0
--------------------------------------
MethodDesc Table
   Entry MethodDe    JIT Name
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   NONE ConsoleApplication1.Program..ctor()
004d0050 00473794    JIT ConsoleApplication1.Program.Main(System.String[])
0047c015 004737a0   NONE ConsoleApplication1.Program.CallExpensive(Int32)
0047c019 004737ac   NONE ConsoleApplication1.Program.CallCheap(Int32)

这一事实CallExpensiveCallCheap已经NONE在JIT列中列出表明他们内联(或不叫所有,但这里并非如此)。



文章来源: How can I see me expensive methods in PerfView