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

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

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

最終更新日 2006 年 11 月 14 日

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

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

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

Step 1 :

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

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

Step 2 :

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

コントロールID プロパティ名 設定値
Button1 (Name) AddButton
Text Add
Button2 (Name) AddRangeButton
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 に続けて以下のコードを追加します。

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

    AddResult.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 j As Integer

    Me.ListBox1.Items.Clear()

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

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


End Sub

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

Step 6 :

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

Step 7 :

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

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

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

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

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


Microsoft