Performance 如何在PerfView中看到昂贵的方法
我创建了一个简单的控制台应用程序,并通过Run命令->PerfMonTest.exe从PerfView执行它 我获取日志文件并查看应用程序的流程。正如预期的那样,它很昂贵(99%的CPU),但是当我想深入研究昂贵的方法时,它们不会显示在昂贵方法列表中 我能做些什么让他们看得见吗 这是我选择流程时的视图。我希望列表中包含CallExpensive和Call便宜: 选择主要方法并不能让我进一步深入研究被调用的方法 以下是应用程序:Performance 如何在PerfView中看到昂贵的方法,performance,.net-4.0,perfview,Performance,.net 4.0,Perfview,我创建了一个简单的控制台应用程序,并通过Run命令->PerfMonTest.exe从PerfView执行它 我获取日志文件并查看应用程序的流程。正如预期的那样,它很昂贵(99%的CPU),但是当我想深入研究昂贵的方法时,它们不会显示在昂贵方法列表中 我能做些什么让他们看得见吗 这是我选择流程时的视图。我希望列表中包含CallExpensive和Call便宜: 选择主要方法并不能让我进一步深入研究被调用的方法 以下是应用程序: using System; using System.Colle
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;
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间性能测试
{
班级计划
{
静态void Main(字符串[]参数)
{
对于(int i=0;i,从屏幕截图上看,您没有加载符号。如果加载了符号,您将看到大部分时间都花在DateTime中。现在
如果在“按名称”视图中单击Main
,您将转到“调用方”视图,该视图将告诉您哪些方法调用了Main
。如果您想深入了解Main
调用了哪些方法,您需要转到“被调用方”视图。如果您这样做,您将看到Main
调用的内容的分解
但是,在这种特殊情况下,CallExpensive
和callsheap
的逻辑非常简单,因此这些方法将被内联(在释放模式下)。由于这些方法是内联的,它们不会作为从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)
0:004>!dumpmt-md 004737c0
EEClass:00471278
模块:00472e94
名称:ConsoleApplication1.Program
mdToken:02000002
文件:C:\temp\ConsoleApplication1\ConsoleApplication1\bin\Release\ConsoleApplication1.exe
基本大小:0xc
组件大小:0x0
VTable中的插槽:8
IFaceMap中的IFACE数:0
--------------------------------------
方法描述表
Entry MethodDe JIT名称
72064a00 71d66728预JIT System.Object.ToString()文件
72058830 71d66730预JIT System.Object.Equals(System.Object)
72058400 71d66750预JIT System.Object.GetHashCode()
72051790 71d66764预JIT System.Object.Finalize()
0047c01d 004737b8无控制台应用程序1.Program..ctor()
004D00500473794 JIT控制台应用程序1.Program.Main(System.String[])
0047c015 004737a0无控制台应用程序1.Program.CallExpensive(Int32)
0047c019 004737ac无控制台应用程序1.Program.CallSheap(Int32)
JIT列中列出的CallExpensive
和CallSweap
有NONE
,表明它们是内联的(或者根本没有调用,但这里不是这样)。我在调试模式下编译了应用程序,现在可以看到CallExpensive。