そこで、今回はそれらの動作速度を比較してみました。
環境
Visual Studio 2010 で言語はC#を使用しました。対象のフレームワークは .NET Framework 4 Client Profile です。
実験に用いたパソコンは私のメインデスクトップPCである「MDV-ASG8300B」です。(Windows 7 Professional Service Pack 1, 64 ビット オペレーティングシステム)
ソースコード
テキストボックスへのテキスト挿入方法を選択し測定開始ボタンを押すと、テキストボックスへのテキストの挿入を実行します。
プログラムの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メソッドを使用する方法
測定タイプ=,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を使用したテキスト挿入法
測定タイプ=,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を使用したテキスト挿入法が大いに役に立つと思います。)
1000 文字(それプラス{行番号、:、改行コード}の文字数)のテキストをテキストボックスのテキストの最後に追加する処理にかかる平均処理時間 (ミリ秒) - 比較棒グラフ
ちなみに、下記のようなテキストボックスのテキストをすべて入れ替える方法では、処理開始後 1 分を経過しても処理が終わりませんでした。(そのため結果がわかる前に処理を中断させました。)
テキストボックスのテキストにテキストを追加する場合に、大量のテキストを扱うことが予想される場合には下記の方法は避けた方が良いでしょう。
textBox.Text = textBox.Text + “追加する文字列”;
コメントを投稿
コメント投稿機能について