Silverlight をインストールするには、ここをクリックします*
Japan変更|すべてのMicrosoft のサイト|サインイン
MSDN
|MSDN ライブラリ|デベロッパー センター|ダウンロード情報|開発ツール製品|コミュニティ|ご意見・ご要望|サイトマップ
MSDN Home > ステップ 7 > .NET アプリケーションの実装 基本知識編 > AddRange メソッドを使ったパフォーマンスの向上

ステップ 7 ハンズオン: AddRange メソッドを使ったパフォーマンスの向上

Windows フォームにおけるパフォーマンスの向上 (コントロール編)

最終更新日 2005 年 2 月 10 日

目標 リストボックスコントロールにデータを追加する Windows フォームアプリケーションの作成
使用技術
  • Visual Basic .NET
取り上げるトピックス
  • Add メソッドと AddRange メソッドのパフォーマンスの違いをアプリケーションで確認する
前提知識
目次
備考 挿入データは .NET Framework が持っている、1月から12月までの月の英語名 (January…) をデータとして使用します。
サンプルアプリケーションの
完成品ダウンロード
Improve_performance_Winform.zip (zip 形式 / 355 KB)

リストボックス コントロールパフォーマンステストアプリケーションの作成

では、リストボックスにデータを挿入するときのメソッドの違いによるパフォーマンスの違いを確認するためのテストアプリケーションを作成してみます。

Step 1 :

Visual Studio .NET 2003 を起動して、以下の設定で新規にプロジェクトを作成します。

プロジェクトの種類 プロジェクトテンプレート プロジェクト名
[Visual Basicプロジェクト] [Windowsアプリケーション] ListBoxControlTest

Step 2 :

ツールボックスから Button Control を2つ、Label コントロールを2つ、そして ListBox コントロールを 1つをフォームに配置し、以下のようにプロパティを設定します。

コントロールID プロパティ名 設定値
Button1 (Name) AddButton
Text Add
Button2 (Name) AddButton
Text AddRange
Label1 (Name) AddResult
Text 0 Count
Label2 (Name) AddRangeResult
Text 0 Count
ListBox1

アプリケーションを実行して選択した画像がフォームに表示されていることを確認します。

アプリケーションを実行した画像

Step 3 :

フォームをダブルクリックして、Form1.vb のコードを表示します。フォームの先頭行に以下のコードを追加します。

Imports System.Globalization

続いてテスト用の変数を設定します。 Public Class Form1 Inherits System.Windows.Forms.Form に続けて以下のコードを追加します。

Private count As Integer = 1000

Step 4 :

AddButton をダブルクリックし、Add メソッドでデータを追加する処理を実装します。

Private Sub AddButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Button1.Click

    Dim start As Integer = Environment.TickCount
    Dim i, j As Integer

    Me.ListBox1.Items.Clear()

    For j = 0 To count
        For i = 0 To 11
            Me.ListBox1.Items.Add(DateTimeFormatInfo.InvariantInfo.MonthNames(i))
        Next
    Next

    Label1.Text = Environment.TickCount - start & " Counts"

End Sub

内側のループで January から December までの文字列を Add メソッドを使って挿入します。ただしこれだけでは時間が不十分なため、外側のループで規定回数だけ繰り返します。

Step 5 :

AddRangeButton をダブルクリックし、 AddRange メソッドでデータを追加する処理を実装します。

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles AddButton.Click

    Dim start As Integer = Environment.TickCount
    Dim i, j As Integer

    Me.ListBox1.Items.Clear()

    For j = 0 To count
        Me.ListBox1.Items.AddRange(DateTimeFormatInfo.InvariantInfo.MonthNames)
    Next

    Label2.Text = Environment.TickCount - start & " Counts"


End Sub

前のステップと同じ処理を AddRange メソッドを使って実装しています。これを見ると分かりますが、前のステップでは FOR ループを回して追加していた部分が、 AddRange メソッド1回にまとめられていることが分かります。コードの可読性という意味でも、 AddRange メソッドにはメリットがあります。

Step 6 :

以上で、実装は完了です。では実際にビルとしてパフォーマンスのテストをしてみましょう。「ビルト」メニューから「ソリューションのビルト」を実行してアプリケーションをビルトします。問題がなければ、「デバッグ」メニューから「デバッグ無しで開始」を実行します。

Step 7 :

始めに Add ボタンを押してみます。このアプリケーションでは January から December の文字列をリストボックスに追加し、そのときにかかる時間を測定します。しかし、12個のデータの挿入はナノ秒単位の処理になってしまうため、違いがわかりません。そこで、このアプリケーションでは、指定したカウント数(1000回)だけ文字列をリストボックスに挿入します。なお、時間の計測は CPU の処理カウントである TickCount を利用します。
Addメソッドを使ってデータを追加した場合、約1000カウントかかりました。 (これは環境によって異なります)

続けて AddRange ボタンを押してテストします。ボタンを押すと始めに ListBox を消去するメソッドを実行してデータをクリアしてから、タイマーの初期値を取得し、データ挿入を解します。この順番を間違えると、データクリアの時間も計測されてしまうため、正しい計測ができません。テストアプリケーションではこういった部分を注意して実装する必要があります。
AddRange メソッドを使ってデータを追加した場合、約200カウントでデータの挿入が完了しました。5倍以上のパフォーマンスが出たことになります。これが、アプリケーションを起動したときの初期設定であれば、ユーザーの待ち時間に影響が出ることでしょう。

アプリケーションを実行して選択した画像

ただし、この方法が使えるのは元データが配列で用意されていることが条件になります。こういった条件が成り立つケースでは、うまく活用してクライアントアプリケーションのパフォーマンスを向上させましょう。

次は 『SuspendLayout メソッドを使ったパフォーマンスの向上について』説明します。


Top of Page Top of Page

Microsoft