「画面が固まる……」を卒業する。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)を仕込んでみてください。そこからが、あなたの本当のエンジニア人生の始まりです。
応援していますよ。また困ったことがあれば、いつでも聞きに来てくださいね。
