起動時間を短縮する方法

.NETの実行ファイル(アセンブリ)は、起動時に時間がかかる場合がある。これは、.NETの実行ファイルが中間コードというもので最終的な実行ファイルではないためである。起動時間がかかる原因は、中間コードをコンパイルしているためである。
コンパイルが実行されるのは、1回目の起動時のみなので、通常は1回目に比べて2回目に起動時間はずっと早くなっているはずだ。

この1回目の起動時間を短縮する方法をご紹介する。
やり方は3つあるが、Windowsアプリケーションの場合は、案2、案3が現実的に使える案であると筆者は考える。

案1 ngenによる事前コンパイル
MSDNライブラリにも載っている方法で、あらかじめ実行環境用にコンパイルしておく方法である。
コンパイラーは、CPUの種類、OSのバージョン、.NET Frameworkのバージョンの組み合わせでもっともパフォーマンスがよい実行ファイルを生成する。非常に賢いコンパイラーなのだが、クライアントPCにアプリケーションを配布する場合はやっかいだ。クライアントの台数が多い場合、クライアントごとに3つの組み合わせ内容を把握し、適切なコンパイル済み実行ファイルを配布するのは、運用上困難であると推察する。(実行にはオリジナルのアセンブリも必要らしい。)

ngenによる事前コンパイルは、ASP.NETのサーバサイドアプリケーションのように実行環境が変化しない場合は有効であると考える。

案2 スプラッシュウィンドウを使う
スプラッシュウィンドウとは、WORDやEXCELの起動時に表示されるようなタイトルの画面である。スプラッシュウィンドウを起動時に表示させて、バックグラウンドで一部の処理を行うということができる。この方法は、タイトル画面を表示させることで、ユーザのイライラ感をごまかしているだけで、実際には起動時間は全く短縮されていないことを付け加えておく。
スプラッシュウィンドウの表示方法は、DOBON.NETさんのサイトが参考になる。


案3 マルチスレッド化する
案2でも不十分なケースで使う方法である。通常、スプラッシュウィンドウはアプリケーションの最初に動作する部分に記述するが、それでもスプラッシュウィンドウ自身が表示されるまでの時間が長くて、トータルの起動時間がかかる場合がる。原因は、起動時の処理(ファイルの読み込み、初期化、モジュールのロードetc)が多いためと予測する。案3は必要最低限のものだけ起動時に処理し、一部をバックグランド処理で行うものである。

たとえば、起動時はまず必要最低限の初期化処理を行ってログイン画面を表示し、表示後バックグラウンドで残りの初期化処理(マスターデータ読み込みなど)を行うのである。ユーザにはログイン画面しか表示されていないので、バックグランドで処理が動いていることには気づかない。

マルチスレッドの方法はいくつかあるが、筆者はデリゲートによるマルチスレッドを使った。筆者はこの策を実践し、現場でうまくいった。


トラックバック

トラックバックURL:
http://www.apricot-jp.com/cgi/mt/mt-tb.cgi/267

関連情報

・Microsoft JScript 実行時エラー:オブジェクトを指定してください。
・このログインで要求されたデータベースXXX を開けません。ログインに失敗しました。ASPNET はログインできません
・Logging Application Blockのトラブルシューティング
・IISのログ出力先
・このログインで要求されたデータベースXXX を開けません。ログインに失敗しました。ASPNET はログインできません
・C# 3.5 yieldの読み方
・ASP.NET サーバーサイドのイベント処理の順番
・ASP.NETのWebページでグーグルアドセンスを貼り付ける方法
・IIS メタベースにアクセスできませんでした
・VSSで管理されているプロジェクトは、ファイルの名前の変更や移動は極力行わない方が良い
・Oracle 9.2へOLE DB接続する方法
・単体テストのデータ
・この行は既に別のテーブルに属しています
・データベースのバージョンは 655 なので、開けません。
・証明書ストアでマニフェスト署名用の証明書が見つかりません。
・次のモジュールは最適化を有効にされて、またはデバッグ情報なしでビルドされました
・String.Concatメソッドを使った文字列の連結
・ファイルの存在をチェックする
・テキストファイルをロードし文字列を読み込むサンプル
・任意の数の引数を受け取るメソッド

Copyright(C) 2007 アーキテクト360 Allrights reserved.