2 Stimmen

Effiziente TableModel-Implementierung

Meine TableModel Implementierungen sitzen in der Regel auf einer ArrayList um eine effiziente Leistung beim wahlfreien Zugriff zu ermöglichen. Allerdings, ArrayList 's remove(int) Die Implementierung sieht ziemlich ineffizient aus, da sie die Erstellung einer System.arrayCopy(...) Aufruf, um alle nachfolgenden Elemente um 1 zurückzuschieben.

Welche Ansätze verfolgen die Menschen bei der Umsetzung TableModel s? Gibt es eine bessere Datenstruktur, die ich in Betracht ziehen sollte? ... vielleicht eine Bibliothek eines Drittanbieters?

Einige weitere Informationen: Meine Tabellendaten können schrumpfen und wachsen, so dass eine Pufferimplementierung mit fester Größe nicht funktionieren wird.

Vielen Dank im Voraus.

2voto

Aaron Digulla Punkte 308693

Ihre Frage riecht nach "vorzeitiger Optimierung".

Auf meinem Computer, System.arrayCopy() kann kopieren 1 Million Datenelemente in etwa 13 ms . So schlage ich vor, zu messen, ob dies wirklich ein Problem ist. Im allgemeinen Fall ist ArrayList schneller und hat eine bessere Speicherleistung als jede andere ähnliche Datenstruktur.

Mit einer LinkedList würde alle Vorgänge auf der Liste (einschließlich remove() ) langsamer, da Sie nun bei jeder Operation (im Durchschnitt) die Hälfte aller Listenelemente durchlaufen müssen. Die meisten Operationen würden also von O(1) auf O(N/2) steigen.

1voto

Peter Punkte 5720

Bei der Implementierung eines TableModel müssen Sie 2 Dinge beachten

1) Erstellung und Bearbeitung des Modells

2) Rendering Ihrer Tabelle

Der erste Punkt ist in Bezug auf die Leistung viel weniger wichtig als der zweite.

In der Regel erstellen Sie Ihr Modell einmal und nehmen nur wenige Manipulationen vor, die Rendering-Engine hinter der Tabelle fragt Ihr Tabellenmodell kontinuierlich ab. Dies bedeutet, dass der Abruf der Informationen aus einem Modell optimal sein muss. Jede Maßnahme, die die Modellmanipulation auf Kosten der Modellabfrage beschleunigt, ist daher zu vermeiden.

In meinem Fall benötige ich beides, schwere Manipulation und schnelles Rendering. Also die Wahl, die ich tat, war eine Art von LinkedList-Implementierung für alle Manipulationen kombiniert mit einem Array, beide sind synchron gehalten, alle Einfügen, Manipulation Löschung wird durch die LinkedList-Struktur, alle Rendering mit der Array-Struktur getan

0voto

extraneon Punkte 22810

Wenn Sie häufig Elemente entfernen müssen, können Sie eine LinkedList-Implementierung wählen. Sie zahlen ein wenig Speicherplatz für schnelle Entfernungen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X