C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: Newに実装べきか、Loadに実装すべきか


(過去ログ 73 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■42330 / inTopicNo.1)  Newに実装べきか、Loadに実装すべきか
  
□投稿者/ らんぺるーる (113回)-(2009/10/13(Tue) 18:28:37)

分類:[VB.NET/VB2005 以降] 

開発したアプリケーションについて、画面の描画処理の性能を測定したところ、
描画処理をNew()メソッドに実装した場合と、Form.Load()メソッドに
実装した場合で、性能が大きく変わるという事象が発生しました。

上記の画面の描画処理とは、フォームに貼り付けた帳票ソフトのActiveXコントロールに対して
、文字の装飾をおこなうというような内容です。
ユーザが画面を開く前に描画を完了する必要があるので、New()メソッドに実装しておりました。

以下ソースのイメージです。
------------------------------------------------------------------------------------------------------------
    Private Sub Form1_Load( ByVal sender As System.Object,  ByVal e As System.EventArgs) Handles MyBase.Load
        Me.帳票ソフトの描画処理()
    End Sub
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
    Private Sub New()
        ' この呼び出しは、Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。

        Me.帳票ソフトの描画処理()
    End Sub
------------------------------------------------------------------------------------------------------------
*「帳票ソフトの描画処理()」については、ActiveX側で用意されている関数を使用して
 行っていますので、掲載はご了承ください。

本処理について、New()で実装した場合の方が性能的に約4倍ほど悪くなりました。

そこで以下が質問の内容となります。
・フォームに配置したコントロールに対する描画処理(文字装飾等)は、本来どちらでおこなうべきか。
・New()で処理をした場合に遅くなる原因はなにか。

なお、本事象については、以下の条件がすべて成立している場合にのみ発生しています。
・WindowsXP(Windows2000,WindowsVistaでは発生しませんでした)
・コントロールをTableLayoutPanel内に配置した場合(TableLayoutPanel内にいれなければ発生しませんでした)



引用返信 編集キー/
■42331 / inTopicNo.2)  Re[1]: Newに実装べきか、Loadに実装すべきか
□投稿者/ Jitta on the way (461回)-(2009/10/13(Tue) 18:34:09)
No42330 (らんぺるーる さん) に返信

> そこで以下が質問の内容となります。
> ・フォームに配置したコントロールに対する描画処理(文字装飾等)は、本来どちらでおこなうべきか。


どちらでもない。
フォームの表示が完了した、というイベントが有ったと思います。そこでするべきかと思います。
引用返信 編集キー/
■42338 / inTopicNo.3)  Re[2]: Newに実装べきか、Loadに実装すべきか
□投稿者/ れい (856回)-(2009/10/13(Tue) 23:45:22)
No42331 (Jitta on the way さん) に返信
> ■No42330 (らんぺるーる さん) に返信
>
>>そこで以下が質問の内容となります。
>>・フォームに配置したコントロールに対する描画処理(文字装飾等)は、本来どちらでおこなうべきか。
>
> どちらでもない。
> フォームの表示が完了した、というイベントが有ったと思います。そこでするべきかと思います。

「フォームの表示が完了した、というイベント」はForm.Shownだと思いますが、それはダメですね。
「ユーザが画面を開く前に描画を完了する必要がある」ので、表示が完了した後ではだめです。

私なら、Form.Loadで初期化します。
なぜそうすべきかについては
LoadやNewの意味など「お行儀」的な面や、
システムに対する負荷の分散など、
いろいろ考慮すべき要素があります。

「帳票ソフトのActiveXコントロール」なら、一番気になるのは
LoadではWindow Handleが作成されているがNewでは作成されていない、
という点でしょうか。
「フォームに貼り付けた帳票ソフトのActiveXコントロール」に、
「New」で「文字の装飾をおこなう」というのは、それだけで「あ、やばそうだな」と感じます。

「俺だったらこうするぜ。理由は無い。」という話だけでは意味がないので、
・New()で処理をした場合に遅くなる原因はなにか。
に関して、質問と提案と予想を。

> 画面の描画処理の性能を測定したところ、
> 描画処理をNew()メソッドに実装した場合と、Form.Load()メソッドに
> 実装した場合で、性能が大きく変わるという事象が発生しました。

「描画処理の性能」はどうやって測定しましたか?
NewとLoadは描画してないので…。
フォームが表示されるまでの時間を計測しているのだったら、
それは「描画処理の性能」ではないはずです。

NewとLoadの間に発生するイベントがいくつかあったと思います。
それぞれで同様に計測して、差を測定してみたらどうでしょうか?
Size系イベントなどの発生回数などを調べてみるのも手です。
TableLayoutPanelだけでなく、その親のPanelにいれてみるのはどうでしょうか?
PanelのAnchorやDockをいじってみるのもいいかもしれません。

これも根拠のない勘ですが。
レイアウトのロジックが何回も呼ばれているのではないかなと思います。
引用返信 編集キー/
■42356 / inTopicNo.4)  Re[3]: Newに実装べきか、Loadに実装すべきか
□投稿者/ らんぺるーる (114回)-(2009/10/14(Wed) 09:48:10)
No42338 (れい さん) に返信
> 「描画処理の性能」はどうやって測定しましたか?

これについてですが、私も同じ処理が複数回実行されている
ため遅いのかもしれないということを考慮しまして、
以下のように、描画処理のみを測定いたしました。

-----------------------------------------------------------------
Dim stopWatch1 As New Stopwatch
stopWatch1.Reset
stopWatch1.Start
帳票オブジェクト.下線を引くメソッド(対象項目名称, True) '下線編集
stopWatch1.Stop
→stopWatch1.Elapsed.TotalSecondsを取得する。
-----------------------------------------------------------------
*上記はサンプルです。実際には下線編集以外もたくさんおこなっておりますし、
対象項目も1000項目ほどあります。

その測定結果が、New()に実装していた場合に遅くなっておりました。

New()では「Window Handle」が作成されていないというのはとても気になりました。
Windowを取得するのに時間を要しているということでしょうか…。




引用返信 編集キー/
■42710 / inTopicNo.5)  Re[4]: Newに実装べきか、Loadに実装すべきか
□投稿者/ らんぺるーる (115回)-(2009/10/20(Tue) 14:36:17)
長い期間レスが頂けませんでしたので、
本件につきましては、クローズにさせて頂きます。

New()で描画処理を行わない方が良いというのは
勉強になりました。

ご回答いただいた方、有難う御座いました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -