3

簡単なコンソール アプリを作成し、Run Command -> PerfMonTest.exe を介して PerfView から実行しました。

ログファイルを取得し、アプリのプロセスを確認します。予想どおり高価です (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

[名前別]ビューでをクリックするMainと、 [呼び出し元]ビューに移動し、どのメソッドが を呼び出したかがわかります。どのメソッドが呼び出しているかを掘り下げたい場合は、 Calleesビューに移動する必要があります。これを行うと、呼び出しの内訳が表示されます。MainMainMain

ただし、この特定のケースでは、CallExpensiveandのロジックCallCheapは非常に単純であるため、メソッドは (リリース モードで) インライン化されます。Mainメソッドはインライン化されているため、コードがそれ自体に折りたたまれているため、から行われた呼び出しの一部として表示されませんMain

You can verify that the methods are inlined by attaching a debugger after the methods have run and look at the method descriptors for the type. Here's the output I got:

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 なし ConsoleApplication1.Program..ctor()
004d0050 00473794 JIT ConsoleApplication1.Program.Main(System.String[])
0047c015 004737a0 なし ConsoleApplication1.Program.CallExpensive(Int32)
0047c019 004737ac なし ConsoleApplication1.Program.CallCheap(Int32)

CallExpensiveとが JIT 列にリストされCallCheapているという事実NONEは、それらがインライン化されたことを示しています (またはまったく呼び出されていませんが、ここではそうではありません)。

于 2013-04-05T17:17:59.803 に答える