# Performance: ArrayList vs. Array vs. "Eigene Liste&quot



## dttob (9. Mai 2008)

Hallo ihr,

mir stellt sich eine eher allgemeinere Frage. Und zwar geht es um die Speicherung großer Datenmengen. Wie sollten aus reiner Performance - Sicht (d.h. schneller Zugriff) diese Daten sinnvollerweise gespeichert werden? 

(vereinfachte Darstellung):
z.B. 5000 Objekte

- ArrayList mit Zugriff über for - Schleife und Iterator oder direkt über arraylist.get(index)
- Arrray mit Zugriff über for-Schleife (begrenzt durch array.length)
- Eigene doppelte verkettete Liste mit Zugriff über getNext(),...

Welche der drei Möglichkeiten macht hier Sinn? Meiner Meinung nach ist eine eigene Liste für dieses Szenario nicht nötig, oder liege ich da falsch? Gibt es alternative, bessere Zugriffsmöglichkeiten für die Fälle, wie z.b. Iterator, usw...

viele Grüße

dttob


----------



## maki (9. Mai 2008)

Wie willst du denn darauf zugreifen?
Suchen?

Vielleicht willst du ja gar keine List, sondern zB. eine Map.


----------



## ARadauer (9. Mai 2008)

Es gibt auch LinkedList von Java welche wahrscheinlihc beim sequenziellen Zugriff einen hauch schneller sein könnte als ArrayList (kann ich aber nicht sicher sagen)

Aber generell, bei 5000 Objekten merkt mans eigentlich nicht


----------



## tfa (9. Mai 2008)

> - ArrayList mit Zugriff über for - Schleife und Iterator oder direkt über arraylist.get(index)


Wenn die Anzahl der Objekte sich ändern kann und es wichtig ist, auf beliebige Indizes direkt zuzugreifen.



> - Arrray mit Zugriff über for-Schleife (begrenzt durch array.length)


Wenn die Anzahl der Objekte sich nicht ändern kann und es wichtig ist, auf beliebige Indizes direkt zuzugreifen.



> - Eigene doppelte verkettete Liste mit Zugriff über getNext(),...


Wenn sich die Anzahl und Reihenfolge der Objekte ändern können und es nicht nötig ist, auf beliebige Indizes direkt zuzugreifen, sondern nur per Iterator (LinkedList). 



			
				dttob hat gesagt.:
			
		

> Wie sollten aus reiner Performance - Sicht (d.h. schneller Zugriff) diese Daten sinnvollerweise gespeichert werden?


Hast du denn Performance-Probleme?


----------



## dttob (9. Mai 2008)

Ich stehe noch recht am Anfang. Damit ich nicht in die falsche Richtung loslaufe, mache ich mir über eine sinnvolle Speicherung lieber direkt am Anfang Gedanken. Hab durch eure Antworten schon ein paar nette Anregungen erhalten.

Denke hauptsächlich wird es ein sequentieller Zugriff sein. Die 5000 Objekte waren nur als Beispiel gedacht, die Datenmengen in der Praxis werden deutlich größer sein. Ich bin auch gedanklich weiter voran gekommen. ;-)

Zum Projekt:
Genauer gesagt möchte ich aus einer DB Werte mit einem zugehörigem Zeitstempel abfragen und in meinem Programm zwischenspeichern und in einer GUI anzeigen. Da auch vergangene, historische Werte angezeigt werden sollen, möchte ich soviel wie möglich zwischenspeichern, d.h. Daten schon vorab laden, auch wenn sie noch nicht benötigt werden.  

Vereinfacht möchte ich den Wert mit Zeitstempel als Objekt in einem 1000 er (festen) Array speichern. 1000 Werte, da so groß mein Darstellungsbereich ist...

Per Thread sollen immer 1000 er Blöcke aus der DB geladen werden und über eine Liste verwaltet werden. Neu geladene Blöcke müssen hinten angehängt werden, oder vorne als ersten Eintrag ergänzt werden.

Zugriff erfolgt entweder direkt, d.h. Wert zum Zeitpunkt X oder zeige Wert zum Zeitpunkt X bis Y an. Das scheint über Iteratoren recht gut zu gehen, allerdings stellt sich mir die Frage nach dem Hinzufügen neuer Blöcke (s.u.).

Nun genauere Fragen:
1. Ist solch eine Vorgensweise sinnvoll, bzw. gibt es schon was "fertiges" von der Java API?
2. Eignen sich die gegebenen Listen (ArrayList, LinkedList) für ein performantes Anfügen von neuen Arrayblöcken? 
Was passiert, wenn ich an den Anfang der Listen einen neuen Eintrag setze? 
Erfolgt ein neuordnen der Liste? 

schöne Grüße

tobias


----------



## tfa (9. Mai 2008)

> Da auch vergangene, historische Werte angezeigt werden sollen, möchte ich soviel wie möglich zwischenspeichern, d.h. Daten schon vorab laden, auch wenn sie noch nicht benötigt werden.


Ich würde genau die Daten laden, die auch benötigt werden (also der Benutzer angezeigt haben will).
Potenziell überflüssige DB-Abfragen machen die Sache sicherlich insgesamt langsamer.

Performance-Probleme, die es noch nicht gibt, sollte man auch nicht zu lösen versuchen.


----------



## dttob (9. Mai 2008)

Da hast du Recht. Erst einmal keine unnötige Energie verschwenden. ;-) 

Aber drücken wir es mal so aus, ich bereite es schon einmal so drauf vor, dass wenn diese Probleme auftreten, ich dann meine Klassen/Programmstruktor recht einfach erweitern kann.  :lol:


----------



## Marco13 (9. Mai 2008)

Ist schwer zu sagen - keiner weiß, was genau du da machst oder machen willst... Wenn du streng vorgegebene Operationen hast, die sich garantiert nicht ändern werden, dann könnte es sinnvoll sein, sich ein Interface dafür zu basteln, und dann ggf. an der Implementierung rumzuspielen, um zu sehen, was am besten ist...

```
interface DataTarget
{
    void appendBlock(Object data[]);

    // .... ?
    // void appendBlockFront(Object data[]);
    // Object[] getData(int minTime, int maxTime);
    // .... ?
}

class ArrayDataTarget implements DataTarget
{
    private Object array[] = ...

    public void appendBlock(Object data[])
    {
        System.arraycopy(neues data in array);
    }
}

class ListDataTarget implements DataTarget
{
    private List list = ...

    public void appendBlock(Object data[])
    {
        for (Object object : data) list.add(object);
    }
}
```

Aber irgendwie klingt es, als würden die Operationen noch nicht so feststehen?!


----------



## byte (9. Mai 2008)

Wenn Du nach Interfaces programmierst und nicht nach der Implementierung, ist die Frage nach der konkreten Listen-Implementierung erstmal sowieso irrelevant. Ich bezweifel eh, dass es an dieser Stelle bei Dir zu performance-Problemen kommen wird. Vielmehr werden so große DB-Abfragen langsam sein. Wenn Du 1000 oder gar 5000 SELECTs absetzt evtl. noch mit ein paar JOINs oder SUBSELECTs drin, dann wird die DB der Flaschenhals sein.
Denk lieber darüber nach, wie Du es von der GUI realisieren kannst, nicht gleich ewig viele Daten anzuzeigen, die eh kein Mensch überblicken kann. Wenn Du z.B. die Daten in einer Tabelle anzeigen willst, dann kannst Du Dir einen Pagable Table bauen, der Seitenweise nur z.B. 100 Datensätze anzeigt. Wenn Du die Daten hingegen in einem Baum anzeigen willst, dann kannst Du über Lazy Loading Trees nachdenken usw.


----------

