日々のコンピュータ情報の集積と整理

Dr.ウーパのコンピュータ備忘録

2014年4月15日火曜日

C#でテキストボックスにテキストを追加する方法:AppendTextメソッドとSelectedTextを使用したテキスト挿入法の動作速度の比較

記事「私がC#でログをテキストボックスに書き出す時に使用していたコード」ではC#でテキストボックスにテキストを追加する方法としてAppendTextメソッドを使用する方法とSelectedTextを使用したテキスト挿入法を紹介しました。
そこで、今回はそれらの動作速度を比較してみました。

環境

Visual Studio 2010 で言語はC#を使用しました。
対象のフレームワークは .NET Framework 4 Client Profile です。

実験に用いたパソコンは私のメインデスクトップPCである「MDV-ASG8300B」です。(Windows 7 Professional Service Pack 1, 64 ビット オペレーティングシステム)

ソースコード

テキストボックスへのテキスト挿入方法を選択し測定開始ボタンを押すと、テキストボックスへのテキストの挿入を実行します。
textbox_measure_design
プログラムのGUI
1000 文字(それプラス{行番号、:、改行コード}の文字数)のテキストをテキストボックスのテキストの最後に追加する操作を 1000 回繰り返し、その処理にかかった時間と、1 回あたりのテキスト追加時間を計測しています。
1 回あたりに追加される1000 文字(それプラス{行番号、:、改行コード}の文字数)のテキスト (1回目の場合)

処理時間にばらつきがないことを確認するため、上記の操作を 3 回繰り返しています。

ソースコードのコアの部分を以下に示します。
        // ログ記録
        void writeLog(String logText)
        {
            textBox_result.SelectionStart = textBox_result.Text.Length;
            textBox_result.SelectionLength = 0;
            textBox_result.SelectedText = logText + "\r\n";
        }

        // 測定タイプ
        public enum MeasureType
        {
            Text,               // テキストボックスのテキストにテキストボックスのテキスト + 追加のテキストを代入する方法
            Selection,          // テキストボックスの Selection にテキストを挿入する方法
            AppendText,         // AppendText メソッドを使用する方法
        };

        // テキスト追加処理を実行し、処理時間を測定する
        private TimeSpan measure(MeasureType measureType, bool doEvents, int MaxLoop)
        {
            textBox1.Text = "";
            Stopwatch sw = new Stopwatch();
            sw.Start();

            for (int i = 0; i < MaxLoop; i++)
            {
                String s = i + ":" + testText + "\r\n";
                switch (measureType)
                {
                    case MeasureType.Text:
                        textBox1.Text = textBox1.Text + s;
                        break;
                    case MeasureType.Selection:
                        textBox1.SelectionStart = textBox1.Text.Length;
                        textBox1.SelectionLength = 0;
                        textBox1.SelectedText = s;
                        break;
                    case MeasureType.AppendText:
                        textBox1.AppendText(s);
                        break;
                }

                if (doEvents)
                {
                    System.Windows.Forms.Application.DoEvents();
                }
            }

            sw.Stop();

            return sw.Elapsed;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            const int MaxLoop = 1000;
            MeasureType measureType = (MeasureType)comboBox1.SelectedItem;
            bool doEvents = checkBox1.Checked;

            // 処理時間のブレがないことを確認するため、何度かループする
            for (int i = 1; i <= 3; i++)
            {
                TimeSpan Elapsed = measure(measureType, doEvents, MaxLoop);

                TimeSpan average = new TimeSpan(Elapsed.Ticks / MaxLoop);
                writeLog("測定タイプ=," + measureType + ", DoEvents=," + doEvents + ", " + i + "回目, 処理時間合計=," + Elapsed + ", 1回あたりの処理時間=," + average);
            }
        }

        String testText = "";   // テストに使用する文字列
        private void Form1_Load(object sender, EventArgs e)
        {
            // 1000 文字分のテキストを作成
            for (int i = 0; i < 1000; i++)
            {
                testText += (i % 10).ToString();
            }

            comboBox1.DataSource = Enum.GetValues(typeof(MeasureType));
        }
    }


プロジェクトの全ファイルは github にアップロードしましたので、そちらを参照してください。

u-pa/textBox_addText_measure
https://github.com/u-pa/textBox_addText_measure

結果

AppendTextメソッドを使用する方法


textbox_appendtext_measure_result

測定タイプ=,AppendText, DoEvents=,False, 1回目, 処理時間合計=,00:00:03.7543081, 1回あたりの処理時間=,00:00:00.0037543
測定タイプ=,AppendText, DoEvents=,False, 2回目, 処理時間合計=,00:00:03.7311014, 1回あたりの処理時間=,00:00:00.0037311
測定タイプ=,AppendText, DoEvents=,False, 3回目, 処理時間合計=,00:00:03.7465643, 1回あたりの処理時間=,00:00:00.0037465

1000 文字(それプラス{行番号、:、改行コード}の文字数)のテキストをテキストボックスのテキストの最後に追加する処理にかかる平均処理時間 : 3.7 ミリ秒


SelectedTextを使用したテキスト挿入法

textbox_selection_measure_result

測定タイプ=,Selection, DoEvents=,False, 1回目, 処理時間合計=,00:00:05.7650158, 1回あたりの処理時間=,00:00:00.0057650
測定タイプ=,Selection, DoEvents=,False, 2回目, 処理時間合計=,00:00:05.5975795, 1回あたりの処理時間=,00:00:00.0055975
測定タイプ=,Selection, DoEvents=,False, 3回目, 処理時間合計=,00:00:05.5716857, 1回あたりの処理時間=,00:00:00.0055716

1000 文字(それプラス{行番号、:、改行コード}の文字数)のテキストをテキストボックスのテキストの最後に追加する処理にかかる平均処理時間 : 5.6 ミリ秒

まとめ

SelectedTextを使用したテキスト挿入法より、AppendTextメソッドを使用する方法の方が処理が速いので、テキストボックスのテキストの最後にテキストを追加する用途ならAppendTextメソッドを使用する方法を使用するとよいでしょう。

(テキストボックスの先頭テキストの途中にテキストを挿入する場合には、SelectedTextを使用したテキスト挿入法が大いに役に立つと思います。)

textbox_appendtext_selection_result

1000 文字(それプラス{行番号、:、改行コード}の文字数)のテキストをテキストボックスのテキストの最後に追加する処理にかかる平均処理時間 (ミリ秒) - 比較棒グラフ


ちなみに、下記のようなテキストボックスのテキストをすべて入れ替える方法では、処理開始後 1 分を経過しても処理が終わりませんでした。(そのため結果がわかる前に処理を中断させました。)

テキストボックスのテキストにテキストを追加する場合に、大量のテキストを扱うことが予想される場合には下記の方法は避けた方が良いでしょう。

    textBox.Text = textBox.Text + “追加する文字列”;






関連記事

関連記事を読み込み中...

同じラベルの記事を読み込み中...