金を払わないとC#のプロファイリングツールは手に入らないのか

Stopwatchクラスを使えばマイクロ秒ぐらいの精度で経過時間を取得できるので、こいつをちょこちょこ埋め込んでいけば関数の処理時間を調べることはできるんだけど、ボトルネックになっている関数を見つけるまでにかなりの手間がかかる。

using System;
using System.Diagnostics;
static class Program
{
  [STAThread]
  static void Main()
  {
    Stopwatch sw = new Stopwatch();
    sw.Start();
    // なにかの処理
    Console.WriteLine("経過時間:{0}", sw.Elapsed);
  }
}

Stopwatchを使って調べていくと下のようにMainから順番に関数呼び出しのツリーを潜っていかないといけない。処理時間の大部分を占めるボトルネックが一つの関数である場合はいいが、複数の箇所に分かれている場合は探すべき箇所が爆発的に増えてしまう。

Main()

// Mainが二つの関数を呼び出し、func00がボトルネックっぽい
Main()   : func00(), func01()

// func00が三つの関数を呼び出し、func10がボトルネックっぽい
func00() : func10(), func11(), func12()

// 以下同様
func11() : func20(), func21(), func22()
func20() : func30(), ...

といっても個人でちょこちょこ作るレベルならこれでもさほど問題にはならない。だけど、Pythonに標準でプロファイリングツールが付いていることを考えるとC#でもやっぱりそういうものが欲しい。

しかし、少し調べてみた限りではフリーで使えるものはないらしい。有料だとPerformance and Memory Profiler - JetBrains dotTraceというものがあってなかなか良さそう。


個人ユースでお値段が2万円かぁ。
学生特権でVisual StudioをMicrosoftからタダで使わせてもらってる身としては、アドオンに2万円払うのはちょっと悔しいがこれは便利そうだ。