- PR -

Windowsアプリの起動時間、どれくらいかかってますか?

投稿者投稿内容
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-04-06 20:33
この手のチューニングの話って「目標は何秒で、今は何秒かかっています」と言った話が無いと、何処まで言っても不毛だと思うんですけど・・・。

「可能な限り起動にかかる時間を早くしたい。」と言うなら、そもそも.NET選択しているのが間違いの元なので、C++で書き直すことを真剣にお勧めします。

.NETアプリケーションの起動がネィテブアプリケーションに比べて遅いのは避けようの無い事です。JITによるコンパイルもさることながら、CLRの起動やイニシャルにかかる時間の方が無視できないでしょう。あなたが起動しているのはC#で書かれた数行のアプリケーションではなく、CLRと言う巨大なアプリケーションだと言う認識を持ってみて下さい。C#で書かれた数行のコードをどの様にいじった所で、劇的な改善など無理だと思いません?
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-04-06 21:19
引用:

なんでJubeiさんの結果とこんなに違うのか?何か差があるのか?
すぐにテストツールに大きな差があることに気づきました。
それは、Jubeiさんのテストツールは呼出側も.NETで実装していることです。

//中略

どうも.NET Frameworkそのものが、最初のexeがキックされた時点で、
準備みたいなもの(?)をしている感じです。



一つの環境でしか試していませんが、呼出をDelphi7(Win32のShellExecute())で作ったアプリケーションで行ってみました。

----
CPU:P4 3.4GHz
MM:2GB
OS:WinXP PRO SP2
----

21時12分41秒765ミリ秒
表示完了は21時12分42秒375ミリ秒

21時12分48秒203ミリ秒
表示完了は21時12分48秒531ミリ秒

21時12分53秒203ミリ秒
表示完了は21時12分53秒484ミリ秒

---------------

で、本題に戻ると、甕星さんの意見が一番説得力があると感じます。



_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-04-07 09:53
引用:
で、本題に戻ると、甕星さんの意見が一番説得力があると感じます。


そう? あの意見は、あまり説得力がないしピントがずれていると思うけど。

元質問者の書き込みを読む限りは「最速」にこだわっているようには見えない。必要十分な早さを求めているだけじゃないかな。それに対して「可能な限り早くしたいのなら〜」とか「ネイティブアプリケーションに比べて〜しかたない」とか極端な方向に話を持っていっているだけ。

自分の経験では・・・。
.NET アプリケーションをダブルクリックで起動するときに、起動が遅すぎるので(マウスがずれて)ダブルクリックに失敗したと判断する利用者が多かったです。それで、もう一度ダブルクリックしちゃうものだから二重起動しちゃったりとか。

まあ起動まで 3〜8秒くらいだったわけですが、それでも「起動処理が始まっていない」と感じる利用者がそれなりの数いたわけで。これは必要十分な速度が出ているとは言えないと思う。

.NET の技術的な仕組みの話は、言いたいことは分かるんだけど納得できない。その話で誰を説得できるんだろうか?

引用:
あなたが起動しているのはC#で書かれた数行のアプリケーションではなく、CLRと言う巨大なアプリケーションだと言う認識を持ってみて下さい。


こんなことを言って「ああ、そうですね。」と納得してくれる利用者がいるわけない。諦めてくれる開発者はいるかもしれないけど。

それに、現在の JavaVM と比べて考えると .NET の動作原理を考慮しても、やっぱり現在の実装は遅いんじゃないかと思う。マイクロソフトはもっと実行環境のチューニング面で努力して欲しい。IE のように OS に密着させて起動を早めるとかのテクニックは使えないのか? サイドバイサイドがあるために、OS 起動時に CLR をプリロードすることができないのか?

・・・そういえば .NET アプリケーションって起動の仕組みが 2000 と XP では違うんだっけ? XP だと .NET 起動のオーバーヘッドが 2000 より少ないと聞いたことがある。


.NET による開発が、開発者にやさしい(工数を減らせる可能性がある)というのは分かるけど、.NET は利用者にどのようなメリットをもたらすのだろう?

現在では、工数すら削減できていないところが多いようだし(削減どころか、.NET にまだ慣れていないからと、今までより割増見積りを出してくるところさえある。) 仮に今後 .NET による工数削減が 利用者に価格面でのメリットをもたらしたとしても、それって結局、安かろう悪かろう(遅かろう) になるだけでは。
Elle
常連さん
会議室デビュー日: 2004/09/29
投稿数: 23
投稿日時: 2005-04-07 11:37
引用:

未記入さんの書き込み (2005-04-07 09:53) より:
自分の経験では・・・。
.NET アプリケーションをダブルクリックで起動するときに、起動が遅すぎるので(マウスがずれて)ダブルクリックに失敗したと判断する利用者が多かったです。それで、もう一度ダブルクリックしちゃうものだから二重起動しちゃったりとか。

まあ起動まで 3〜8秒くらいだったわけですが、それでも「起動処理が始まっていない」と感じる利用者がそれなりの数いたわけで。これは必要十分な速度が出ているとは言えないと思う。


ふむ。
であれば、「起動したことを示すスプラッシュウィンドウを表示し、本体(.NETのプログラム)を起動する」というだけのプログラムをC++(MFC)等で作ってしまうという手もありますね。

.NETの利用者から見た価値といえば、それが開発者にとって楽なら「生産性」即ち「納期と価格」及びそれらから波及するであろう「品質、(機能的な)性能」じゃないですかね。
.NETを使用しようが、C++(MFC)を使用しようが、納期も価格、品質、(機能的な)性能が変わらないというのであれば、実行速度が遅い分だけ.NETの価値はないわけですが。
蓮華
常連さん
会議室デビュー日: 2004/11/06
投稿数: 25
投稿日時: 2005-04-07 12:29
個人的に使用している解決方ですが、1つは既に書かれてるように、
MFCやC/C++などで起動用の画面を作り、オフィスのように今裏で何がされているのかを
ユーザに見せる事で、視覚的にPCが裏でアプリを使用する準備をしてることを知らせ、
錯覚させる方法。

もう1つは.NETで何もしない、しかも画面にも出てこないアプリケーションを作り、
スタートアップで起動させてしまう。

結局、.NetFrameworkを使用したアプリはフレームワーク上で動くため、
初回起動時に、フレームワークなどをPCに読み込む為なんだから、
スタートアップ時にこの作業を行わせてしまえば、
ユーザーは起動してからもしばらくHDDがカリカリするな・・・ぐらいにしか感じない。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-04-07 15:57
諸農です。

引用:

未記入さんの書き込み (2005-04-07 09:53) より:
引用:
で、本題に戻ると、甕星さんの意見が一番説得力があると感じます。


そう? あの意見は、あまり説得力がないしピントがずれていると思うけど。



そうでしょうか。
目標値というのは必要だと思います。
サンプルのようなこれ以上チューニング出来そうに無い
単純なアプリケーションコードのような場合には、
見る視点を変えて対策を練るのが得策なのでは、
と言うように、私は捉えましたが。

ただ、今回の場合、直前に.NETアプリが起動していると
もう一つのアプリケーションの起動が早くなるような
現象も見え隠れしています。
こういった情報も有効活用できるのではないでしょうか。
そういった意味では不毛な議論で終わっていないはずですよね。

引用:

.NET による開発が、開発者にやさしい(工数を減らせる可能性がある)というのは分かるけど、.NET は利用者にどのようなメリットをもたらすのだろう?



現在、.NET開発者(提案者/社)が直面している課題ですね。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
やんたん
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 63
投稿日時: 2005-04-07 17:54
やんたん(質問者)です。
みなさんたくさんのご指摘・アドバイスありがとうございます!

パフォーマンスを求めるなら.NETを選択すべきではないといったご指摘もありましたが、.NETを利用する前提であればDAIさんが書かれている2点の方法が有力なようですね。
引用:
MFCやC/C++などで起動用の画面を作り、オフィスのように今裏で何がされているのかを
ユーザに見せる事で、視覚的にPCが裏でアプリを使用する準備をしてることを知らせ、
錯覚させる方法。
もう1つは.NETで何もしない、しかも画面にも出てこないアプリケーションを作り、
スタートアップで起動させてしまう。


私もこの2点かなと思っており、どちらかといえば.NETのランタイム(CLR)を先に動かしておくという方法がよいのかなと思います。
(起動画面をC++で作るというのは起動時間自体の改善にはなっていないので)

そこで実際にその構成を取っているDAIさんに質問です。
引用:
.NETで何もしない、しかも画面にも出てこないアプリケーションを作り、
スタートアップで起動させてしまう。


これって、端末が終了するまでずっと起動しっぱなしにしとくんですか?
実証してみたのですが、スタートアップで起動させてその見えないアプリはすぐ終了。すると数十分するとキャッシュ?か何かがクリアされ、再度アプリを起動するとまた起動に時間がかかるようになってしまいます。
見えない.NETアプリを常駐させておくということは、メモリを消費しますよね。
起動時間を取るか、メモリをとるかといった感じですね。
(最初に提示した検証用のアプリでも10M程度消費しますからね。)

まとめますと、CLRのロード時間の改善には、先に何らかのアプリでCLRをロードしておく。
そのためのメモリ消費は(10M程度だし)仕方がないというところが落とし所ですかね。

実はここからさらに、皆さまの考えを聞かせてもらいたい質問が出てきたのですが
内容がちょっと異なりますので一旦ここで区切ります。
やんたん
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 63
投稿日時: 2005-04-07 18:36
引き続きやんたん(質問者)です。
今までの書き込みでは、.NETの起動が遅い原因はアプリ起動時にCLRをロードする必要があるからで
それを改善するには事前にスタートアップなどで見えないアプリを動かしておくということでした。

ここからはCLRのロードの話ではなく、CLRがロードされてからフォームが表示されるまでの
話になります。
まずは以下のURLにこのような情報が掲載されておりました。
引用:
メソッドは初めて使用されるときに JIT で処理されます。
http://www.microsoft.com/japan/msdn/net/general/dotnetperftips.asp
(このあたりについてもう少し詳しく書かれたサイトがあったんですがどこにあったか忘れちゃいました )


これと絡んでいると思うのですが、実アプリケーション起動前に見えない.NETアプリを起動してからアプリケーションを起動させてみました。
その場合、exeのダブルクリックからフォーム表示までの時間の改善度合いは40%程度でした。
また、実アプリケーションを起動させておいて、さらに同じ実アプリケーションを起動させると改善度は
90%以上でした。

上記のURLと検証結果を総合すると、CLRのロード自体の短縮はなんらかの.NETアプリを起動させればよいが
フォーム表示までの時間を短縮したい場合は、それまでに実行されるメソッド自体を事前に
実行しておく必要があるのではと思っています。
(フォーム表示前に実行される処理を精査すべきという議論は、十分認識してますのではここでは置いときます)

結構推測部分が多いですが、みなさんのお考えを聞かせていただければと思います!

スキルアップ/キャリアアップ(JOB@IT)