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

EXE起動スピードは遅い

環境/言語:[WIN2000 VB.NET2003]
分類:[.NET]

開発用PCのCPUは2.6G。EXEのサイズは600Kぐらい。起動時間は8秒。
正常ですか?
構成ビルドの設定とか関係がありますか?

よろしく。
2004/08/05(Thu) 17:16:41 編集(投稿者)

■No5365に返信(johnさんの記事)
> 開発用PCのCPUは2.6G。EXEのサイズは600Kぐらい。
でかっ!! TOO BIG SIZE!!
何か重いリソースでも入ってるんでしょうか?

> 起動時間は8秒。
それは、最初のフォームが表示されるまでの時間ですか?
もし、フォームが表示される前にDB接続など色々やってるのなら、
それらを外してやってみてください。
また、他のサイズのEXEファイルだとどうなのでしょうか?

> 正常ですか?
正常かどうかはわかりませんが、良くないでしょうね。

> 構成ビルドの設定とか関係がありますか?
Debug構成でもそれほど変わらないはずです。


■追記
ちなみに私の環境で、1番重いプログラム起動時

OS.    : Win2K || WinXP Pro
CPU.   : Pen3 500MHz
RAM.   : 256MB
EXE SIZE : 256.25 KB
DLL SIZE : 88.2 KB

こんな低スペックでも2秒くらい。(DB接続込み)
javaさん、ありがとう!

> 何か重いリソースでも入ってるんでしょうか?
特に無いです。画面は10個ぐらい。DLLなど使ってない。
+CrystalReport + TRUEdbgrid

> それは、最初のフォームが表示されるまでの時間ですか?
そうですね。

> もし、フォームが表示される前にDB接続など色々やってるのなら、
> それらを外してやってみてください。
DBはSQL-Serverですが、関係がないと思います。もう一つ120KぐらいのEXEは、すぐ出てます。
johnさん、こんにちわ。

■No5373に返信(johnさんの記事)
>>何か重いリソースでも入ってるんでしょうか?
> 特に無いです。画面は10個ぐらい。DLLなど使ってない。
> +CrystalReport + TRUEdbgrid

リソースは安全で高速ですが、あまりサイズがでかいといかがなものでしょう...
あと、画面が10画面って…Formは結構サイズありますからね...
もっとモジュール化するべきではないでしょうか?

>>もし、フォームが表示される前にDB接続など色々やってるのなら、
>>それらを外してやってみてください。
> DBはSQL-Serverですが、関係がないと思います。もう一つ120KぐらいのEXEは、すぐ出てます。

でしょうね。

あと、最初に表示する(Loadされる)Formのコントロール数が、
かなり多いと(50超とか)かなり遅く感じることになります。
なぜなら、コンストラクタおよび、InitializeComponent()で時間を浪費するからです。

多分、そのあたりを見直した方がよろしいでしょう。

# ところで、johnさんは名前のごとく外国の方ですか?
返事ありがとう。

> もっとモジュール化するべきではないでしょうか?
「モジュール化」の意味は、別々のEXEを作りますか?
いま、もう一つでかいプログラムを作っています。タブコントロールのページ数は10ぐらい、一つのなかの入力項目は30ぐらい。まずいでしょう。

> # ところで、johnさんは名前のごとく外国の方ですか?
はい。中国からです。日本語はまた下手ですね。
VBは、むかしからずっと使ってますけど、VB.NETは初心者です。
今度もよろしくお願いします。
こんにちわ、johnさん。

■No5378に返信(johnさんの記事)
>>もっとモジュール化するべきではないでしょうか?
> 「モジュール化」の意味は、別々のEXEを作りますか?

そうです、別々のProgram (Project) に分けるべきです。
(分けられるならの話ですが)

> いま、もう一つでかいプログラムを作っています。
> タブコントロールのページ数は10ぐらい、
> 一つのなかの入力項目は30ぐらい。まずいでしょう。

それは、まずいですね。

設計者(SE)は、なぜそんな仕様を作ったのでしょうか...
もし、仕様変更ができないのなら、「無理」と言うしかないですね。
いくら、EXEファイルを最適化したところで、
1番、CPUの負担になる GUI(コントロール) がこんなのでは、無理でしょう...

> はい。中国からです。日本語はまた下手ですね。
> VBは、むかしからずっと使ってますけど、VB.NETは初心者です。
> 今度もよろしくお願いします。

そうですか... 大変ですね。

# 私も知り合いにいますけど、大変らしいです...
こんばんは。ちょっとしたテクニックですが、裏で一度、小さい.NETアプリケーションを起動&終了させると、実際に動かしたいアプリの起動時間が短くなります。
理由は省きますが、簡単に言うと、一度、.NET Frameworkが立ち上がると…ってな訳です。(゚Д゚ )
詳細はググったら見つかると思います。
とりあえず、一度、お試しあれ。
■No5365に返信(johnさんの記事)
> 開発用PCのCPUは2.6G。EXEのサイズは600Kぐらい。起動時間は8秒。
> 正常ですか?
> 構成ビルドの設定とか関係がありますか?
>
> よろしく。
ん?今、開発中のアプリ、1.77M有りますが(デカ!)、長くて4秒ですねぇ…
どこかに問題がありませんか?
ちなみに、CPUは1.7Gですよ。
2004/08/06(Fri) 09:13:16 編集(投稿者)

■No5388に返信(ぺがらぼさんの記事)
> ん?今、開発中のアプリ、1.77M有りますが(デカ!)、長くて4秒ですねぇ…
> どこかに問題がありませんか?
> ちなみに、CPUは1.7Gですよ。

ということは、やはりEXEサイズというより、
初期表示(に関わらず表示しようとする)Form内のコントロール数でしょうか...

実験すると、すごく遅くなってしまいました。
(EXEサイズは、別のFormで色々埋めて同じようなサイズに合わせました)
例えば、200個くらい配置すると、デザイナでも起動するだけで時間が...
(コードと同期を取っているからでしょうけど)
同様に、EXEから起動しても...
■No5397に返信(java.lang.Nullpoさんの記事)
> 2004/08/06(Fri) 09:13:16 編集(投稿者)
>
> ■No5388に返信(ぺがらぼさんの記事)
>>ん?今、開発中のアプリ、1.77M有りますが(デカ!)、長くて4秒ですねぇ…
>>どこかに問題がありませんか?
>>ちなみに、CPUは1.7Gですよ。
>
> ということは、やはりEXEサイズというより、
> 初期表示(に関わらず表示しようとする)Form内のコントロール数でしょうか...
>
> 実験すると、すごく遅くなってしまいました。
> (EXEサイズは、別のFormで色々埋めて同じようなサイズに合わせました)
> 例えば、200個くらい配置すると、デザイナでも起動するだけで時間が...
> (コードと同期を取っているからでしょうけど)
> 同様に、EXEから起動しても...

johnさん、java.lang.Nullpoさん、こんにちは。
えっとですね。デザイナでは関係ありますが、exeに関してはあまり関係なさそうです。
私が開発しているものを例に挙げますと、フォーム数約20画面(もう少し増える予定)、10帳票程。
コントロール数は平均50個(多いものは100個ほどあります。)当然、めんどくさいので、デザインしたコントロールを配列化する方法を使っています。(私のサイトにて公開)
もちろん、データベースも使っていますし、INIファイル、App.configファイル、テキストボックスは私が作成したテキストボックス(私のサイトにて公開)、データベース用の各フォーム毎のクラス、などなどをひとつのプロジェクトに組み込んでいます。
それでも、起動時間は長くて4秒程です。

そう考えると、ソースの大きさばかりが遅い原因ではなさそうな気がします。
例えば、
・起動時にデータベースに接続し、大量のデータを取得している。
・try等を使ってエラートラップしている。(この場合、エラーの原因を探らずに放置している。)
・すべてのフォームを起動時にロードしている。
う〜〜〜ん、今すぐに思いつくのはそんな感じです。
起動時にどうしても大量のデータを取得するのであれば、スレッドを使うといった方法で解決させるなどありますが…ヒントになりますか?
こんにちわ、ぺがらぼさん。

■No5409に返信(ぺがらぼさんの記事)
> えっとですね。デザイナでは関係ありますが、exeに関してはあまり関係なさそうです。

確かに、EXEから起動してFormを出すより、デザイナでFormを出す方が重いです。

> 私が開発しているものを例に挙げますと、フォーム数約20画面(もう少し増える予定)、10帳票程。
> コントロール数は平均50個(多いものは100個ほどあります。)当然、めんどくさいので、デザインしたコントロールを配列化する方法を使っています。(私のサイトにて公開)
> もちろん、データベースも使っていますし、INIファイル、App.configファイル、テキストボックスは私が作成したテキストボックス(私のサイトにて公開)、データベース用の各フォーム毎のクラス、などなどをひとつのプロジェクトに組み込んでいます。
> それでも、起動時間は長くて4秒程です。
>
> そう考えると、ソースの大きさばかりが遅い原因ではなさそうな気がします。
> 例えば、
> ・起動時にデータベースに接続し、大量のデータを取得している。
> ・try等を使ってエラートラップしている。(この場合、エラーの原因を探らずに放置している。)
> ・すべてのフォームを起動時にロードしている。
> う〜〜〜ん、今すぐに思いつくのはそんな感じです。
> 起動時にどうしても大量のデータを取得するのであれば、スレッドを使うといった方法で解決させるなどありますが…ヒントになりますか?

ちなみに私はどれも当てはまりません。(体感速度はとても気にしていますので)
が、私の環境はコントロールが多いと急激に遅くなりますです。
ですので、

> コンストラクタおよび、InitializeComponent()で浪費

という発言をしました。
実際、デバッガで動かしても、その当たりで時間を浪費しているようなのですが...
何か、他に原因はなさそうですか?

# 私の場合は、スペックが低すぎるだけかもしれませんね。 ■No.5366参照
java.lang.Nullpoさん、こんにちは。

> # 私の場合は、スペックが低すぎるだけかもしれませんね。 ■No.5366参照

確かに、.NETになって著しくマシンスペックが要求されるようになりましたね。
VB.NETやC#はJITコンパイラなので、ソースが大きくなればなるほど、起動に時間がかかるのは仕方ないと思います。当然、InitializeComponent()のソースが大きければなおさらです。
ですが、johnさんの場合は別のところに原因があると思われます。
別の解決方法として、ngen.exe(ネイティブ・イメージ・ジェネレータ)というコマンドラインツールを使用して事前にJITコンパイルするという方法もありますよ。
返事ありがとう。

今日、いろいろやって昨日よりは速くなりました。

起動時間は4秒ぐらいです(CPUは2.6G)。但し、別のクライアントもちょっと遅いです。

サーバー室の管理人に聞いて、多分昨日のサーバーの作業が多いですから、クライアントの接続は遅かったです。

ちなみに、画面のコントロール数と関係がないと思います。別のEXEのなかには、一つ画面に600ぐらいコントロールを持っています。最初の起動スピードは同じぐらいです。

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