📘

【Visual Basic 6.0】プログラムの負荷軽減・高速化

2022/07/04に公開

プログラムの負荷軽減・高速化(サンプルコード付き)

開発環境

カテゴリー 名称 詳細バージョン
OS Windows XP (SP3) Version:2002
プログラミング言語 Visual Basic 6.0 (SP6) Version:9782

不具合内容

現象
システムを使用していると、だんだん動作が遅くなる。実際に発生した現象では、イベントの受け取りや画面表示に時間がかかるようになる。
タスクマネージャーではハンドル数、メモリの使用率は許容範囲内だった。
このことから、オブジェクトの解放忘れやメモリ不足は起きていないと考えられる。

原因
確実な原因は分かっていないが、システムの負荷を軽減することで現象の発生する頻度が減ることが分かった。

対応方法
負荷を減らし、現象の発生を抑えるために以下の対応を行った。
①オブジェクト変数の宣言時にNewを行わないようにした。
②DoEvents関数をタイマーで何度も呼び出していたため、待機関数を使用して回数を減らした。


①オブジェクト変数の宣言について

変数の宣言とオブジェクトの生成を同時に行うと、オーバーヘッド(オブジェクトが利用されるたびに毎回チェックが入る)ため、負荷がかかる。
オブジェクトの存在が保証される(Nothingを設定してオブジェクトが破棄された場合でも、オブジェクトを再利用しようとすると、再作成される)書き方に変更することで、処理時の負荷を軽減します。

変更前
Dim x As New MyClass()
変更後
Dim x As MyClass
x = New MyClass()

②DoEvents関数について

処理の途中でもDoEvents関数を使用することで、一時的にOSに制御を移してイベントの処理を行っていました。
DoEvents関数を呼び出すと、実行している処理が安定せず、処理時間が長くなることがあります。そのため、不要なDoEvents関数は削除し、必要な場合でもDoEvents関数を実行する回数を減らす(毎回ではなく、1000回ループするごとに1回行うなど)ことで負荷を軽減します。


引用

Microsoft|VB 6.0 ユーザーのための VB .NET 移行ガイド
IT求人ナビ|VBA Sleep関数について、同じような機能を持つ他の関数やメソッドについても紹介
Excel作業をVBAで効率化|VBAの処理を一時中断してWindowsの操作を行う(DoEvents)
TipsFound|VBA DoEvents 関数:応答なしを回避する

Discussion