DOBON.NET DOBON.NETプログラミング掲示板過去ログ

1回目の起動が遅い

環境/言語:[Microsoft .NET Framework1.1]
分類:[.NET]

Webサービスを用いてWebサーバと通信できるシステムを
Microsoft Visual Studio .NET 2003を用いて構築をしております。

そこである問題に直面しました。

PCを立ち上げてアプリケーションを起動する際
1回目と2回目の起動時間に大きな開きがあり大変困っております。
具体的にはEXEをダブルクリックして起動してからFormが表示されるまでの時間を指します。
Webサービスを利用しているので多少遅いことは覚悟していたのですが、
1回目と2回目の起動にこれだけ差があると、他に原因があるように思えてなりません。

===================================================================================================
≪PGテスト概要≫

 起動時間
  1回目 約18秒
  2回目 約 7秒

 EXEのサイズ 424KB
 CPU    Intel Celelon 1.8GHz
メモリ  368MB RAM
Microsoft .NET Framework1.1

 ・自分で作成したDLLを6つ「参照設定」で取り込んでいます。このDLLには厳密名を与えていません。
 ・自分で作成したWebサービスを5つ「Web参照の設定」で設定しています。
 ・起動時にWebサービスへ接続しています。
 ・DLLはVB.NET2003で作成しました。
 ・WebサービスははVB.NET2003で作成しました。
 ・インストーラを使用せずEXEとDLLを同じディレクトリに配置して動作させています。
 ・EXEとDLLはPC起動時にWebサーバから最新版だけをFTPでダウンロードする仕組みになっています。
 ・このテスト結果は弊社内LANでのもので100Mbpsのネットワークを使用しています。インターネットの回線は利用しておりません。

===================================================================================================


ネットワークの問題もあるのだろうと考え、1Gbpsのネットワークを試してみたのですが
起動そのものは早くなったものの、依然1回目と2回目の起動にかなりの開きがあります。

様々な文献やホームページを参考にさせていただき、
自分なりに原因を追究してみました。

ほとんどの文章では
ネイティブ イメージ ジェネレータ (Ngen.exe)
http://msdn2.microsoft.com/ja-JP/library/ms165073.aspx
を利用することで大抵の場合、この問題を解決できると書かれていました。

そこである雑誌を参考に簡単なバッチファイルを作成してみました。
以下にそのバッチファイルの内容を記述します。

C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\ngen.exe "C:\Program Files\NewSystem\Program.exe"
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\ngen.exe "C:\Program Files\NewSystem\Cls_Com.dll"
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\ngen.exe "C:\Program Files\NewSystem\Cls_Cst.dll"
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\ngen.exe "C:\Program Files\NewSystem\Cls_Config.dll"
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\ngen.exe "C:\Program Files\NewSystem\Cls_Ftp.dll"
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\ngen.exe "C:\Program Files\NewSystem\Cls_Msg.dll"
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\ngen.exe "C:\Program Files\NewSystem\Cls_Ctl.dll"


1行目がEXEで残りの6行は自分で作成したDLLです。
エラーも表示されず、とりあえずは成功したようです。

しかし、PCを再起動しEXEを実行したところ、Formを表示するまでに20秒程かかってしまいました。
これではあまり変化がありません。しかも前より遅くなったような気すらします。

再度調べてみたところ、どうやら.NET Framework1.1以外の関数を使用している場合、
あらかじめプリコンパイルしておいても、EXE起動時にJIT(Just-In-Time)コンパイラにより
コンパイルされてしまうため、起動時間に変化はないとの事・・・。
そこで、Format$()などのVB固有の関数を.NET Frameworkの関数に置き換えてみましたが、
それでも変化はありません。

次に実行するEXEの依存関係を調べ
関係する全てのアセンブリをプリコンパイルしてみようと考えました。

ngen.exeでプリコンパイルを実行すると
そのアセンブリはMicrosoft .NET Framework 1.1の
アセンブリキャッシュに登録されるようです。
Microsoft .NET Framework 1.1 構成を開き依存関係を調べてみると
自分で作成したDLLのバージョンがアセンブリキャッシュされている物と、
依存関係で表示されているものとで違う事に気付きました。

これが原因?なのでしょうか・・・?
つまり、EXEと依存関係にあるDLL(アセンブリ)のバージョンと同じものを
プリコンパイルしてアセンブリキャッシュに登録してあげればよいと言う事でしょうか?

しかし、このシステムはEXEとDLLのカスタマイズが頻発することが予想され
とてもDLLのバージョン管理までできません。

そして、その様な状態でもPGは動作し、
1回目は遅くても2回目はそれなりに起動できるのです。

.NETで作成されたEXEはその依存関係にあるDLLのバージョンがたとえ違うものでも
同じディレクトリ内にそのが存在すれば問題なく動作するという事なのでしょうが、
どうも納得いきません。

このシステムのような構成でも2回目の起動は1回目に比べ格段に早いのです。
それには何か理由があるのでしょうし、回避する方法もあると思うのです。

それともやはり、登録したEXEに依存しているDLLのバージョンが同じでないとプリコンパイルは効果ないのでしょうか?

どなたか、同じような問題で回避の方法を知っていましたら教えていただけないでしょうか?
また、Microsoft .NET FrameworkはEXEを起動する際どのように処理しているのか、
JIT(Just-In-Time)コンパイラの詳細も知りたいのです。
それをより理解することで、問題解決に少しでも近づきたいのです。

以上よろしくお願い致します。
  • 題名: 【報告】この投稿はマルチポストです
  • 著者: (報告)
  • 日時: 2006/09/08 14:52:13
  • ID: 17492
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
この投稿はマルチポストです。

●マルチポストされている場所
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=707805&SiteID=7

----------
この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのマナーについて」をお読みください。

●書き込みのマナーについて
http://dobon.net/vb/bbs/index.html

DOBON.NET | プログラミング道 | プログラミング掲示板