VisualStudio
VisualStudio2017

Visual Studioのパフォーマンスプロファイラー

More than 1 year has passed since last update.

はじめに

この記事は Microsoft Student Partners Japan Advent Calendar 2017 4日目の記事です。
今回はVisual Studioに搭載されているプロファイラのお話です。

パフォーマンスプロファイラーとは

作成したプログラムのどこが遅いかなどを調査するためのツールでVisuals Studioの場合はCPU使用率, GPU使用率, メモリ使用率などを調査することが出来ます。

プログラム実行時に表示される診断ツールでも全体のCPU使用率やメモリの使用量がわかりますが、パフォーマンスプロファイラーを使うことで関数レベルで調査することが出来ます。
image.png

このツールを使うことで例えば重たい処理をしている関数を特定したり、メモリリークの調査を行うことが出来ます。

今回はCPU使用率のプロファイリング機能を使って色々見てみます。

サンプルコード

今回はフィボナッチ数列を愚直な方法でも止めるFibHeabyメソッドとメモ化を使い高速に求めるFibLightメソッドを用意しました。
これらを軽い処理と重い処理としてパフォーマンスプロファイラを使います。

class Program
{
    static int FibHeaby(int n)
    {
        return n == 0 || n == 1 ? n : FibHeaby(n - 2) + FibHeaby(n - 1);
    }
    static Dictionary<int, int> Table;
    static int FibLight(int n)
    {
        if (Table.ContainsKey(n))
        {
            return Table[n];
        }
        var ret = FibLight(n - 2) + FibLight(n - 1);
        Table.Add(n, ret);
        return ret;
    }
    static void Main(string[] args)
    {
        Table = new Dictionary<int, int>();
        Table[0] = 0;
        Table[1] = 1;
        Console.WriteLine("FIB Light N=100000");
        FibLight(100000);
        Console.WriteLine("FIB Heab N=45");
        FibHeaby(45);
        Console.WriteLine("END");
        Console.ReadKey();
    }
}

プロファイラーでCPU使用率を調べてみる

Visual Studioで調査したいプログラムのプロジェクトを開き「分析」から「パフォーマンスプロファイラー」を選択します。

image.png

「CPU使用率」を選択し「開始」を選択します。
image.png

※CPU使用率とメモリ使用率は同時に調査できないです。

開始ボタンを押すと通常通りプログラムが立ち上がりますので、プロファイルを取りたい機能を動かし終了させます。
プログラムを終了させると結果が表示されます。
image.png

また、詳細を見たい時間帯を選択することで選択した範囲内で呼び出された関数の一覧が表示されます。
image.png

この段階でもどの関数がボトルネックか表示されますが、「詳細なレポートを作成します」を選択することで更に細かな情報が表示されます。
image.png

とくにどの順番で関数が呼ばれるものが一番時間を使っているかがわかるホットパスは重要です。

また、詳細レポートの関数名をクリックすることでソースコードがあれば該当するソースコードを表示してくれます。
image.png

ソースコードのどこがよく呼ばれているか、指定した関数は主にどこから呼ばれるかなどもわかります。

終わりに

今回はVisual Studioに搭載されているパフォーマンスプロファイラーを紹介しました。
自作プログラムや研究室などで開発しているプログラムなどを高速化する必要がある時にぜひ使ってみてください。

免責事項

この記事は1ペンギンの個人的な見解を含み、所属する団体等を代表するものではありません。