[VisualStudio2017] C# でTextBoxに連続で大量の文字列を追加すると遅くなるので、高速化を考える。みんなほんとに早くなってる?^^;

2018/03/21 追記:表示更新用のDoEventが重かったり、処理によってはファイルに書き出して、読み出した方が早いです(^◇^;
BMP1600万ピクセルのカラーをテキストボックスに書き出しなど、メモリ内でやる方が馬鹿ですがヘ(゚∀゚ヘ)アヒャ

「実際に思いつく限り試して早いやつで!」
おま環でした。
—-

結論:ゲームプログラミングでは当たり前のダブルバッファ的な手法を使います。
(キャッシュから外れるような大きいデータアクセスをしていると、他のサイトでたくさん書かれている方法ではあまり早くならなかったので・・・)

フォームに配置したTextBoxにテキストを追加するのは非常に遅いのは文字表示プログラム作ったことがある人なら誰でも分かることですが、一般的な高速化技法で書かれているサイトを見ても効率は大して変わらなかったんじゃないかなと思います(^◇^;
テキストが追加されると描画されちゃいますもんね^^;

SelectIndexとかAppendTextでも全然話にならない重い処理(データ量よりも、TextBoxへの処理回数)。ただ追加するだけでも128×128のピクセル情報を書き出すと気が遠くなります
。軽く1万6000回超えますものねヘ(゚∀゚ヘ)アヒャ
今のPCなら1秒に1行程度の出力ならどんな方法でも体感できる遅延とか負荷はないと思います。

私も通常のログ出力はこちらを使わせていただいてます。

私がC#でログをテキストボックスに書き出す時に使用していたコード
http://upa-pc.blogspot.jp/2014/04/c.html

かといって、別の管理方法導入するほど真面目なお金の発生するプロジェクトでもデバッグできる時間もないのが日曜プログラミングですものね・・・

そこで、フォームに置かず、でもTextBox的な処理はやりたいそういうときに、内部でもう一つ用意して内部TextBoxに処理を行い結果を貼り付ける。
これで「大抵」はなんとかなります(^◇^;

仮想とか、仮とか、テンポラリとかハイドとかまぁ概念は一緒です。
proc()
{
TextBox textBoxTemp = new TextBox();
ループ
{
textBoxTemp.Text += “追加する文字列”;
}
textBoxDisp.text = textBoxTemp.Text;
}
(イメージ)

株トレードも一緒です。どこでも使えば良いって物ではないですが、知ってる人は当たり前のように使う方法ですね。

—-
キャッシュから外れる大きいデータにアクセスしてますm(__)m
シンプルに後ろに文字列くっつけるだけです。128x128回、処理を呼び出してます。
このプロセス以外は同じ処理です。
約16,700行、700KBくらいのデータ生成です。
普段ならファイルに書き出す処理ですね^^;

それをクリップボ・・・こことは関係ないか(^◇^;
デバッグモードなので、実速度は不明です。

速度計測してみる。
1回目:(TimeStamp:00:00:06.0519016)
2回目:(TimeStamp:00:00:06.1209471)
3回目:(TimeStamp:00:00:06.0617603)

Releasec:(TimeStamp:00:00:06.1811334)

private void OutputDataLine(string logText)
{
textBoxLog.Text += logText + “\r\n”;
}
—-
・普段使い用。表示行削ったりいじるときに便利だよね…
1回目:(TimeStamp:00:02:58.5319648)
2回目:(TimeStamp:00:03:04.6596441)
3回目:(TimeStamp:00:03:06.4340553)

Release:(TimeStamp:00:02:54.6543528)
private void OutputDataLine(string logText)
{
textBoxLog.Select(textBoxGen.Text.Length, 0);
textBoxLog.SelectionStart = textBoxLog.Text.Length;
textBoxLog.SelectionLength = 0;
textBoxLog.SelectedText = logText + “\r\n”;
}
—-
・後ろに追加するだけ
1回目:(TimeStamp:00:01:21.4883463)
2回目:(TimeStamp:00:01:27.0448043)
3回目:(TimeStamp:00:01:24.1339280)

Release:(TimeStamp:00:01:18.2318539)
private void OutputDataLine(string logText)
{
textBoxLog.AppendText(logText + “\r\n”);
}

とりあえず、原因は不明。
目標レスポンス(銀行のATMとか)3秒とは行かない物の我慢できる範囲に向上したので、高速化の時間はまた別の時に。

これだけなら長い文字列作ってテキストに追加など、回数減らした方がもっと早くなると思う。
しかし遅いと言われてる処理の方が早かったり、最適化が進んだのか他の呼び出し処理の存在とか何だろうね^^;
6秒と80秒とか話にならない何かが!w

深追いはしないのです。引退して気楽なおっさんは!’`,、(´▽`) ‘`,、

いやぁこの先・・・数百万行の書き出し処理テストが…il||li _| ̄|● il||li

タイトルとURLをコピーしました