2012-05-13 6 views
2

一般的なテキストエディタを実装するとき(一般的な意味では、巨大なファイルを扱う必要がないことを意味します(100-200 MB以上「一般的なケース」の極端な例のように))、挿入/削除を実行するパフォーマンスが低下するため、テキストを連続した1つの長いバッファに格納することは現実的ではありません。テキストエディタ内部テキストストレージ:最適なチャンクサイズ?

それは、あなたがテキストを複数の塊に分割しなければならないという事実の周りを回っているので、私の質問は、今日のコンピュータパワーを考えれば、最適な塊のサイズはどれくらいでしょうか?実際には単純な連続バッファに格納するには大きすぎますか?現代のコンピュータはどれだけ高速にバイトを移動していますか? (間違いを避けるため、ギャップバッファは使用できません。各チャンクは単純な連続配列です)

答えて

1

一般的なコンシューマシステムでは、DDR3メモリで10〜30 GB /秒のRAWメモリスループットを達成できます。それは基本的な数字の一種です。

私の経験から、1秒あたり約100MBのメモリ操作を達成するためにJavaでは問題はないと考えても安全だと思います(C++ではおそらく4~8倍も可能です)。それから、64kbのバッファーサイズでは、2^10 /秒の操作を行っても問題ないと思われます。

3

ほとんどのエディタはGapTextStoreを使用して実装されているため、単一のgabを有する緩衝液。

GapTextStore状態のJaveDocの興味深い部分:

は、テキストストアを管理するギャップを実装します。ギャップテキストストアは、文書に対する連続的な変更が同じ場所にあるという仮定に依存している。ギャップの開始点は、常に最後の変更の位置に移動されます。

パフォーマンス:タイピングスタイルの変更は、再割り当てが必要になるまで一定の時間内に実行されます。一般に、再割り当てを引き起こさない変更は、約dの長さの多くとも1つのアレイコピー操作を引き起こし、dは以前の変更からの距離である。長さxの配列コピー操作のアルゴリズム性能をa(x)とし、その変化をO(a(x))、get(int、length)をO(a(長さ))、get (int)をO(1)に入れます。

アレイの再割り当てが必要な頻度は、コンストラクタパラメータによって制御されます。

0

data structure known as a "rope"(ロープはもちろんヘビー級文字列の一種です)にお読みください。元のSGI STL had themおよび文字列は、C++標準ライブラリには入っていませんが、Gnu has them as an extensionです。

"チャンクサイズ"は実装(notes)には表示されないことに注意してください。これは怠け者で機能的なやり方で行うことがはるかに多くなります。

+0

私が書いたように、これを効率的に扱うことができるデータ構造がたくさんあります。それらのすべて(はい、ロープも)は実装に「チャンクサイズ」を持っています。他の唯一の選択肢は、各ロープセグメントに1つの文字/要素のみを含めることです。その実装が非効率的であるとは想像もできません。もちろん、既存の図書館を利用する場合は、これらの詳細については考えません。しかし、自分の低レベルの実装に最適なチャンクサイズが何であるかを知りたかったのです。 – Cray

+0

ロープに「セットされた」葉のサイズがなく、すべてがダイナミックですが、最終的にはロープのバランスをとる必要があり、メモリの移動や再配置などがあります。コンテキストでは、チャンクサイズも重要です。 – Cray

関連する問題