viviエディターの作者がスライドで行テーブルの更新を部分的に行う方法だと早いと言っていたので実装してみた。
http://slides.com/nobuhidetsuda/texteditorimpl#/
##気づいたこと
・LinkedListかGappedVectorじゃないとテーブル操作でO(N)かかるので複数行の編集操作が行われるケースではあまり意味はない
・stepRowをまたいだ削除を行うと落ちる
・複数行の挿入を行うと落ちる
スライドを隅から隅までみたが、こういうケースについては言及していなかった。なので、自分なりに場合分けしてみた
##1文字挿入(削除)した場合
スライドで書かれている通りに行えば問題なし
##行をまたいだ削除が発生した場合
1.行テーブルから削除する範囲を割り出す
2.行テーブルから削除する
3.stepRowを削除した1で計算した範囲のひとつ前に設定する
4.stepIndexを更新する
##複数行の置き換えがある場合
1.対応する行テーブルを作成する
2.1で作成したデータの先頭行以外のインデックスからstepIndex分だけ引く
3.もともとある行テーブルに2で処理した行テーブルを挿入する
4.stepRowを挿入した位置に設定する
##ベンチマーク
「XYZ入ってる。XYZ入ってる。XYZ入ってる。XYZ入ってる。XYZ入ってる。XYZ入ってる。XYZ入ってる。」が10万行あるテキストを「XYZ」から「ABCDE」に置き換えた場合、従来の方法だと4秒近くかかっていたものが0.5秒程度で済むので、効果はあるもよう
ただ、0.5秒で済ませる実装だとDirect2DのDWriteTextLayoutで1行に65535文字あるケースで落ちてしまうので、それを考慮した実装にすると1秒程度にまで落ちてしまう
※core i5 2550、メモリー8GB、RADEON HD5770、Win8.1 x64