【入門編】Windows Formsのパフォーマンス測定とボトルネック解析:StopwatchクラスとTrace.CorrelationManagerを活用した実務プロファイリング – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

「画面が固まる……」を卒業する。VB.NET プロファイリングの極意

こんにちは。現場で「なぜか遅い」というコードと毎日格闘している皆さん。

「動作が重い」というユーザーからの抽象的な文句、エンジニア泣かせですよね。しかし、プロフェッショナルは感覚で語りません。「どこで、何ミリ秒かかっているか」を数値で突き止める。 これが、マクロの記録から脱却し、真のエンジニアになるための第一歩です。

今日は、Visual Basic (VB.NET) において、泥沼のパフォーマンス解析を「科学的な調査」に変えるための、最強の武器を紹介します。

—

1. 勘に頼らない:Stopwatchクラスによる「精密計測」

VB.NETには `DateTime.Now` で時間を比較する方法もありますが、あれはOSの時刻同期の影響を受けるため、パフォーマンス測定には不向きです。

我々が使うのは、CPUのサイクルを正確にカウントする `System.Diagnostics.Stopwatch` です。

実践:処理時間をピンポイントで計測する

Imports System.Diagnostics

Public Sub ExecuteHeavyProcess()
‘ 1. Stopwatchのインスタンスを作成
Dim sw As New Stopwatch()

‘ 2. 計測開始
sw.Start()

‘ — ここに「重い」と思われる処理を記述 —
System.Threading.Thread.Sleep(500) ‘ 例:500msかかるDB検索や重いループ
‘ —————————————-

‘ 3. 計測停止
sw.Stop()

‘ 4. 結果を可視化(デバッグウィンドウに出力)
Debug.WriteLine($”処理時間: {sw.ElapsedMilliseconds} ミリ秒”)
End Sub

ここがポイント:
`Stopwatch` は、処理の「直前」で `Start` し、「直後」で `Stop` する。これだけで、自分の書いたコードがどれだけ贅沢にCPUを使っているかが白日の下に晒されます。

—

2. ログの迷子を救う:Trace.CorrelationManager

アプリが複雑になると、「どのボタンを押した時の、どの処理で時間がかかったのか」がログの中で混ざり合って分からなくなります。ここで登場するのが `Trace.CorrelationManager` です。

これは「論理的な作業単位」をタグ付けするための機能です。

実践:処理の「血統書」をつける

Imports System.Diagnostics

Public Sub ProcessWithTrace()
‘ 一意のID(アクティビティID)を生成してスレッドに紐付ける
Trace.CorrelationManager.ActivityId = Guid.NewGuid()

‘ ログ出力(どこからでもこのIDが参照可能)
Trace.WriteLine(“処理開始: データロード”)

‘ …処理…

Trace.WriteLine(“処理終了: データロード”)
End Sub

ここがポイント:
`ActivityId` を設定しておけば、どんなに複雑なクラス構成でも、ログファイルを開いたときに「同じIDを持つログだけ」をフィルタリングするだけで、その一連の処理の流れが一本の線として浮かび上がります。

—

3. なぜ「重い」が起きるのか?(よくある罠)

初学者がVB.NETで陥りやすいボトルネックの代表例を挙げておきます。これらに心当たりはありませんか?

  • UIスレッドでの重い処理: `Button_Click` イベントの中に数秒かかる処理をそのまま書いていませんか? Windows FormsはUIを描画するスレッドと処理を実行するスレッドが同じです。ここが埋まると画面は「フリーズ」します。`Async / Await` の導入を検討してください。
  • 不必要な再描画: `DataGridView` や `ListBox` に1行ずつ `Items.Add` していませんか? 描画処理は非常に重い操作です。一度リストや配列にデータを溜めてから、最後に一括でバインド(表示)するのが鉄則です。
  • 文字列の連結: ループの中で `str &= “text”` を繰り返すと、メモリ上で無駄なオブジェクトが大量生成されます。`System.Text.StringBuilder` を使いましょう。

—

4. プロのエンジニアへのステップアップ

今回の計測手法をマスターすると、皆さんの開発スタイルは劇的に変わります。

1. 仮説を立てる: 「おそらくこのループが遅いだろう」
2. 計測する: `Stopwatch` を仕込んで数値を出す。
3. 改善する: `StringBuilder` を使う、データ取得のSQLを見直すなど。
4. 検証する: 再度 `Stopwatch` を回し、「○ミリ秒短縮!」と確信を持つ。

このサイクルを回せるようになれば、もう「なんとなく遅い」と悩むことはありません。

最後に:あなたへのアドバイス

VB.NETは歴史が長く、枯れた言語ですが、だからこそ基礎を突き詰めれば最強の生産性を発揮します。今回紹介した `Stopwatch` や `Trace` は、最初は面倒に感じるかもしれません。しかし、「計測できないものは改善できない」。これはエンジニアリングの鉄則です。

今日から、すべての「重い」処理に、自分だけのタイムキーパー(Stopwatch)を仕込んでみてください。そこからが、あなたの本当のエンジニア人生の始まりです。

応援していますよ。また困ったことがあれば、いつでも聞きに来てくださいね。

タイトルとURLをコピーしました