Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何在PerfView中看到昂贵的方法_Performance_.net 4.0_Perfview - Fatal编程技术网

Performance 如何在PerfView中看到昂贵的方法

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

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

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

我能做些什么让他们看得见吗

这是我选择流程时的视图。我希望列表中包含CallExpensive和Call便宜:

选择主要方法并不能让我进一步深入研究被调用的方法

以下是应用程序:

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。