前回、自作テキストエディタのテキスト管理方法について記事にしました。今回は実際に行追加と行削除をした場合、処理性能はどうなのかを自作エディタで検証してみました。結論としては、実行するPCのマシンスペックにもよりますが、List で管理しても 1,000 万行ぐらいなら問題なさそうです。
自作エディタのテキスト管理方法
テキストは行単位に StringBuldier にして List に登録しています。一般的に List は検索は速いですが、追加、削除は更新行以降のデータを再構築する必要があるため、更新行以降の行数に比例して遅くなります。
検証内容
1行120文字のテキストを10万行、100万行、1,000万行で読み込み、先頭行、最終行でそれぞれ追加と削除を行い処理時間を計測してみました。テキストエディタのため、行追加などをするとやり直しデータを作成していますが、純粋に行の編集にかかった時間を計測しています。
検証結果
それぞれ、3回計測した平均値(秒)です。
行数 | ファイル読込 | 先頭行に追加 | 最終行を削除 |
---|---|---|---|
10万行 | 0.2195455 | 0.000955533 | 0.0000299 |
100万行 | 2.160485433 | 0.000963167 | 0.0000333 |
1,000万行 | 24.1 | 0.010583315 | 0.0000175 |
ファイル読込
1,000万行になるとファイル読込が遅いですが、行数に比例して遅くなっているので妥当かと思います。
先頭行に追加
10 万行と 100 万行の行追加はほとんど変わらない結果になりました。1,000 万行でも 0.01 秒なので体感でもそこまで遅くは感じませんでした。
こちらも行数に比例して遅くなっているので List の特性が出ているかと思います。
最終行に追加
最終行の場合は、更新対象の行が存在しないため、行数が増えても、ほぼ処理時間は変わらない結果になりました。こちらも List の特性が確認できました。
おわりに
当初の想定通りの結果になったと思います。テキストエディタのテキストの管理には配列、双方向リスト、ギャップバッファが一般的なようですが、List で管理しても十分なパフォーマンスが出るように思います。
その他の方法も試すことができれば、また記事にしたいと思います。
コメント