2009-07-28 10 views
2

私のTableModelの実装は、効率的なランダムアクセスパフォーマンスを実現するために、通常ArrayListにあります。それは人々に近づき何1.効率的なTableModelの実装

バック後続のすべての要素をシフトするSystem.arrayCopy(...)呼び出しを行う必要しかし、ArrayListremove(int)実装がTableModelのを実装するに連れて行くかなり非効率的に見えますか?私が検討すべきより良いデータ構造がありますか? ...おそらくサードパーティ製のライブラリですか?

さらに詳しい情報:私のテーブルのデータは縮小して拡大するので、固定サイズのバッファの実装は機能しません。

ありがとうございます。

答えて

2

あなたの質問Reeks "時期尚早な最適化"。

私のコンピュータではSystem.arrayCopy()1 million elements of data in roughly 13msをコピーできます。だから私はこれが本当に問題かどうかを測ることを提案する。一般的なケースでは、ArrayListは他の類似したデータ構造よりも高速であり、優れたメモリ性能を備えています。

LinkedListを使用すると、各操作(平均)のすべてのリスト要素の半分をトラバースする必要があるため、リスト上のすべての操作(remove()を含む)が遅くなります。したがって、ほとんどの操作はO(1)からO(N/2)になります。

+0

ありがとうアーロン、それは良い点です。 TBH私はArrayListを試してみましたが、何か注文してビルドする前に、私はちょうどもっと効率的なものが箱の中に存在するかどうか疑問に思っていました。 – Adamski

+0

arrayCopyは高度に最適化されています。それよりも速いものは見つけられません。あなたの場合、コピーは平均して65nsかかります。あなたが気づくことはありません。 –

+0

それは誤解を招くことです。一度それを行うための13msはOKですが、あなたは間違いなくそのリストから10000要素を削除したくありません。そのコレクションにフィルタを適用すると、簡単にそのようになる可能性があります。 –

0

要素を頻繁に削除する必要がある場合は、LinkedList実装を選択できます。あなたは迅速な除去のために少しのメモリを支払う。

+0

残念ながら、 LinkedListはランダムアクセスではないため、アクセス時間に影響を与えますので、これは実際の選択肢ではありません(特に、テーブルには〜10000行が含まれる可能性があります)。 – Adamski

1

モデル

2を作成し、操作する)あなたは2つのこと

1を検討する必要があるのTableModelを実装する)あなたのテーブルをレンダリング

最初はたくさんあまり賢明その後、重要な性能秒です。

モデルを一度作成してわずかな操作を行うと、テーブルの後ろのレンダリングエンジンがテーブルモデルを連続的に照会します。 これは、モデルからの情報の検索が最適でなければならないことを意味するので、モデルクエリのコストでモデル操作をスピードアップするために取られるアクションは避けなければなりません。

私の場合、私は重い操作と高速レンダリングの両方が必要です。だから私がした選択は、配列と組み合わせたすべての操作のための一種のLinkedList実装であり、両方とも同期され、すべての挿入、操作の削除はlinkedlist構造、配列構造によるすべてのレンダリングによって行われています

関連する問題