gpt4 book ai didi

performance - 我如何在 PerfView 中看到昂贵的方法

转载 作者:行者123 更新时间:2023-12-04 02:39:14 24 4
gpt4 key购买 nike

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

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

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

这是我选择进程时的 View 。我希望列表中有 CallExpensive 和 CallCheap:

enter image description here

选择 Main Methods 并没有给我机会进一步钻研被调用的方法

enter image description here

这是应用程序:

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;
}
}
}
}

最佳答案

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

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

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

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

0:004> !dumpmt -md 004737c0EEClass:         00471278Module:          00472e94Name:            ConsoleApplication1.ProgrammdToken:         02000002File:            C:\temp\ConsoleApplication1\ConsoleApplication1\bin\Release\ConsoleApplication1.exeBaseSize:        0xcComponentSize:   0x0Slots in VTable: 8Number of IFaces in IFaceMap: 0--------------------------------------MethodDesc Table   Entry MethodDe    JIT Name72064a00 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 在 JIT 列中列出了 NONE 的事实表明它们是内联的(或者根本没有被调用,但是这里不是这种情况)。

关于performance - 我如何在 PerfView 中看到昂贵的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12828491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com