- - PR -
.NET Windowsフォームのパフォーマンスについて
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-10 10:58
お世話になってます。
以前から、VB.NET2005(ベータ版)で今後開発予定のソフトのプロトタイプ(紙芝居) を作っています。 画面は、実際のソフトの雰囲気が伝わるようにコントロールを貼り付けて作り込んで いますが、実際の処理は何も書いていません。 はじめは、処理速度に違和感無く動いていましたが、気がつくとソフトの起動から フォームの表示が異常に遅いものになっていました。 遅い箇所を調べると、このスレッドのようにフォームのインスタンスを生成(New)する 箇所が約8秒と異常におそいのです。 プロジェクトを3つほどに分けて部分的にフレームワーク化していたり、自作コン ポーネントを呼び出すようにしているので、はじめはDLLの読み込みに時間がかかって いるのかと思ったのですが、どうもDLL読み込みのタイミングではなさそうです。 また、クラスの初回ロードに遅いかとも思いましたが、2回目以降も同じくらいの遅 さです。ngenを試しても変わりありません。 さらに、画面のコントロールが多いのかと思い、一からプロジェクトを作成して、 そのフォームにコントロールをたくさん貼り付けてみたり、プロトタイプの表示の 重い画面をプロジェクトに組み込んで読み込んでみたりしてみたのですが、まったく 同じフォームなのに、こちらのほうは3〜400ミリ秒程度と比較的速くNewできて います。 インターネットで調べると.NETは遅いという記事はちらほら見かけますが、どれも これといった解決方法は見つからず、何が原因なのか分かりません。 VB.NET2005(ベータ版)なので、本格的な原因追求は製品版が出てから調査しようと 思っています(ベータ版のバグ?そのほか、よく落ちたりもしますし)が、何か調べる 方法や、心当たりのある方はおられませんでしょうか? PS. このスレッドは最後の投稿から1年以上経過していますが、jemini_777さんがどの ように解決したか、教えていただけるとありがたいです(支障なければ)。 | ||||||||
|
投稿日時: 2005-11-10 11:24
あれから、画面に貼り付けてあるコントロールを徐々に取り除き、最初、テキスト
ボックスやボタンはもちろん、ラベルやパネル、タブなども含めるとコントロールの 数が200ほどあったものが、のこり10程度になっても、生成にまだ8秒程度か かっています。 Showメソッドは300ミリ秒程度が、60ミリ秒程度にはなりましたが。 もっと絞り込んでいきます。 | ||||||||
|
投稿日時: 2005-11-10 11:55
双方で自動生成されたコードの比較検証はしてみましたか?
その遅いと今回の「遅い」は違うものだと思います。 記事にある「遅い」は、Java も遅いと言われる理由の「遅い」と同じでしょう。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2005-11-10 12:01
お騒がせしました。諸悪の根源を見つけました。
あれから、画面上のコントロールをすべて取り除いても、フォーム生成に8秒くらい かかっていました。 結局、ソースに残ったのはメンバ変数だけとなり、もしやと思い、メンバ変数のなか のVB-Reportのオブジェクト変数(Newしている)を消してみると、瞬間でフォーム生成 されるようになりました。 あらためて、プロトタイプの画面からVB-Reportを取り除いたものでフォーム表示して みると8秒くらいかかっていたものが500ミリ秒程度になりました。 逆に、新規のプロジェクトのフォームにVB-Reportをメンバ変数として貼り付けてみ ると、やはり8秒くらいかかりました。 ま、今あるVB-Report.NETはVB.NET2003のものなので、VB.NET2005ベータ版で動かすこと 自身間違っていますが、それにしても遅すぎる。 VS2005の製品版とVB-Reportの.NET2.0対応版が出るのを待つしかありませんね。 お騒がせしました。 | ||||||||
|
投稿日時: 2005-11-10 12:05
目的が紙芝居ならフォームを分けるとか、ユーザーコントロールにして必要に応じて動的にロードするように修正するとか、コントロールの数を減らして逃げる方法は多々ありますよね。Windows標準コントロールはWindowsハンドルを含め多くのリソースを必要とするので、大量にロードすることは問題あります。Microsoft Office製品などはWindowsの標準コントロールを使わず、独自に実装したコントロールを使うことで避けていますよね。
Javaが遅いのと本質的に同じ理由です。 .NETでは関数が始めて呼び出されるときに、ネィテブコードへのコンパイルが行われます。その関係で、初回の実行は2回目以降に比べて大幅に時間がかかります。もし初回実行時の処理時間が問題なら、ngen等を使うことで改善できます。ngenで解決しないなら「.NETが遅い」というのが原因ではないでしょう。
英語版のVB.NET2005は既に製品版が出ています。とりあえず製品版でも同様か試してみては?あるいは落ちたことをMicrosoftに不具合として通知してあげてください。不具合を見つける為のβ版なんですから。 | ||||||||
|
投稿日時: 2005-11-10 13:36
ちなみに・・・
VB.NET2005ベータ版では、VB-Report.NETのオブジェクトの生成に8秒程度かかって いましたが、VB.NET2003製品版でも5〜6秒ほどかかっています。 今まで、ActiveX版はよく使用していましたが、オブジェクトの生成ではこれほど遅い ことは無かったように思います。 過去、ActiveX版のときにVB-Reportが遅い件について調べたことがありましたが、 Page.Beginメソッドは確かに遅かったように記憶していますが・・・。 また、Out.PreViewメソッドも今回異常に遅いようです。データ貼り付けまでは、すぐ 処理は終わっているようですが、プレビューだけで4〜6秒かかっています。 | ||||||||
|
投稿日時: 2005-11-10 14:03
やはり、ソースレベルの検証は必須ですよね。
VB-Report for .NET ってそんなに遅かったでしたっけ? 数秒もかからない記憶がありますけど... _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2005-11-10 14:18
こんにちは。
とりあえず、フォーム生成に数秒かかるという問題は解決しました(VB-Reportがなぜ 遅いか?は残ったままですが)が、コントロールの数が多いと画面描画がパラパラと 表示されるような感じで遅いですね。 ただ、極力グリッドなどを使うなど、無駄な項目を減らしてはいますが、それでも 入力項目だけでなくラベルやボタン、パネルやタブなどのコントロールをすべて勘定 してみると、やはり100個以上になることが多いです。同じような画面でもVB6以前 でもこんなにパラパラ表示されることは無かったように思うのですが・・・。 >パフォーマンスの劣化が無くても、1枚のフォームにコントロールを100個も >200個も散りばめるような設計はこの機会に見直すべきだと思いますが。 これは、ラベルやパネルなども含めての数なのでしょうか? 皆さんは、.NETの開発ではどれくらいの数を目安として画面設計されていますか? [ メッセージ編集済み 編集者: maru 編集日時 2005-11-10 14:19 ] |