C#のパフォーマンス最適化技法
- date
- 2019-12-06
C#のパフォーマンス最適化技法
速度測定
BenchmarkDotNet ライブラリを使う
Stopwatch より正確なベンチマークパッケージ。
使い方は公式ページ参照。
benchmarkdotnet 公式
Stopwatch クラスを使う
BenchmarkDotNet 程正確ではないが、簡単に使える。
Microsoft Docs Stopwatch クラス
以下のような Utilty があれば楽。
/// <summary>
/// 処理時間計測Utilty
/// </summary>
public static class StopwatchUtilty
{
private static Dictionary<string, Stopwatch> _dic = new Dictionary<string, Stopwatch>();
/// <summary>
/// 計測開始
/// </summary>
/// <param name="processName"></param>
public static void Start(string processName)
{
_dic[processName] = new Stopwatch();
_dic[processName].Start();
}
/// <summary>
/// 再計測開始
/// </summary>
/// <param name="processName"></param>
public static void Restart(string processName)
{
_dic[processName].Restart();
}
/// <summary>
/// 計測停止
/// </summary>
/// <param name="processName"></param>
public static void Stop(string processName)
{
_dic[processName].Stop();
}
/// <summary>
/// 計測結果
/// </summary>
/// <param name="processName"></param>
public static void Result(string processName)
{
// 結果表示
Console.WriteLine($" {processName},{_dic[processName].Elapsed.ToString()}");
}
}
最適化
Boxing させない。
インライン化する。
無駄な処理をさせない。
メモリ割り当て、GC を減らす。
Boxing
簡単に説明すると、
まず、メモリを確保する際にヒープとスタックがあり。
そしてスタックと比べるとヒープの方が重たい。
object 型で値のやり取りをする場合に box 化,unbox 化が発生する。
box 化するとヒープへ割り当てられる。(Heap Allocation)
なので、box,unbox はパフォーマンス的によろしくない。
box 化させないためには
object 型を使用しない。
メソッド呼び出し時にジェネリックがあればそちらを使う。
Microsoft Docs ボックス化とボックス化解除
Clr Heap Allocation Analyzer 拡張を使うと警告が表示される。
IL を確認する
ILSpy
DnSpy
ildasm
メモリ最適化
VisualStudio のデバッグ-ウィンドウ-診断ツールの表示から診断ツール表示。
適宜スナップショットをとって直前のスナップショットと比較する。
参照の削除。(参照されていると GC で解放されないため)
イベントの削除。(参照が残るので)
Dispose の徹底。(using を使う)
Lambda での変数のキャプチャに気をつける。
前の記事
はじめに
次の記事
vscode お勧め拡張