ArrayList zu langsam ???
-
Hallo.
Ich habe eine ArrayList. Ich speichere mir dort Elemente rein. Das Ablegen in dem Array dauert aber lange. Ist das so und wenn ja gibt es eine alternative.
Das Array dient als queue.Viele Dank
-
Ich schätze ne LinkedList wird dir helfen
-
Zeus schrieb:
Ich schätze ne LinkedList wird dir helfen
Ich vermute eher nicht. Es gibt zwar theoretisch ne ganze Menge Situationen, in denen eine LinkedList im Vorteil sein müsste, aber in der Praxis habe ich eine ArrayList trotzdem immer als schneller empfunden. Man müsste sich mal angucken, wie die genau aufgebaut ist. Ich habe eine ungefähre Vorstellung davon, aber ich glaube, in Wirklichkeit ist die ArrayList viel intelligenter gemacht, als man denkt.
Benchmarks bezüglich ArrayList vs. LinkedList würden mich zumindest interessieren.
-
WTF bei reinen Kopieren ist die ArrayList bisschen mehr auf Zack o.O
Einzeltest und Xms hochgeschraubt.
package javaapplication5; import java.util.AbstractList; import java.util.ArrayList; import java.util.LinkedList; import java.util.Vector; public class Main { final static int SIZE = 10000000; public static void createRandom(AbstractList<Integer> src) { for (int i = 0; i < SIZE; ++i) { src.add(i); } } public static void copy(AbstractList<Integer> src, AbstractList<Integer> dst) { for(int i = 0; i < SIZE; ++i) { dst.add(src.get(i)); } } public static void copyCase(AbstractList<Integer> src, AbstractList<Integer> dst, String test) { long current = System.nanoTime(); copy(src, dst); long end = System.nanoTime(); System.out.print(test + ":"); System.out.print((end - current)/ 1000000000.0); System.out.print("\n"); } /** * @param args the command line arguments */ public static void main(String[] args) { Vector<Integer> source = new Vector<Integer>(SIZE); createRandom(source); System.out.println("Vorbereitung komplet"); LinkedList<Integer> linkedList = new LinkedList<Integer>(); ArrayList<Integer> arrayList = new ArrayList<Integer>(); copyCase(source, linkedList, "Linked"); copyCase(source, arrayList, "Array"); } }
-
Wie sehen Deine Ergebnisse genau aus?
-
0,6s für ArrayList und 0,8s für LinkedList
-
Zeus schrieb:
0,6s für ArrayList und 0,8s für LinkedList
Geht ja durchaus noch. Weißt Du, wie es aussieht, wenn Du die Datenstrukturen noch ne Größenordnung größer machst? Oder sprengt das schon den Arbeitsspeicher? Dann müsste die LinkedList ihre Vorteile ausspielen können. ...falls sie welche hat.
-
Faktor ArrayList LinkedList
1x 0,6 0,8
2x 2,9 3,8
2,5x 3,6 4,4
3x 4,5 40 (Java hat sich selbst weggeschmießen)P.S. jetzt bleib nur die frage, wie gut ist die ArrayList mit ausspucken vom Element während sie auch noch Elemente hinten eingefügt werden, dazu hab ich zuzeit aber kein Lust zu coden.^^ Faktor bleibt die ArrayList wird wirklich unterschätzt
-
Servus,
naja, ich persönlich habe etwas gegen derartige Benchmarks. Sie sind sehr von der akt. Situatuion abhängig
Das Ablegen in dem Array dauert aber lange. Ist das so und wenn ja gibt es eine alterna..
Lange bezogen auf was?
Sollten dich die Sun-Implementierungen von den Standardkomponenten nicht zufrieden stellen, kannst du dir mal die Apache Collection ansehen. Diese weißen in der Regel eine klizig kleinen Performanceschub auf.Gruß,
Thomas
-
Siassei schrieb:
Servus,
naja, ich persönlich habe etwas gegen derartige Benchmarks. Sie sind sehr von der akt. Situatuion abhängig
Wieso? Diese Benchmarks sind doch sehr aufschlussreich. Nie ein dummer Vektor über den weggelaufen, der immer um 1 Element den Bereich vergrößert. Man sollte blos keine absoluten Aussagen aus diesen ziehen. Besondern, weil ich alles öffne, den Code und die art wie Benchmarke. Ein Benchmark bringt nix, wenn man nur Ergebnisse postet... dann sind Sie nichts sagend
-
Vielen Dank für die vielen Informationen .
Also ich habe ca 900.000 Elemente die der Reihe nache nach in die ArrayList geschriben werden und danach wireder infernt werden. ( Dazwischen passieren noch einige OPerationen). Das ist mein Sachverhalt. Ich habe mal gelesen, dass sich für sehr große Datenmengen ein Vector besser eigent. Stimt das ?
-
Fischkopf2009 schrieb:
Ich habe mal gelesen, dass sich für sehr große Datenmengen ein Vector besser eigent. Stimt das ?
Nein. Ein Vector ist vor allem synchronisiert. Er eignet sich also dann, wenn Du aus mehreren Threads gleichzeitig auf diese Datenstruktur zugreifst. Die Synchronisation kostet allerdings Zeit, so dass in anderen Fällen die ArrayList besser ist. Ich habe in meinem Kopf abgespeichert, dass die ArrayList eine nichtsynchronisierte Version eines Vectors ist. ...aber wie schon gesagt: Ich glaube fast, dass die ArrayList noch ein ganzes Stückchen intelligenter implementiert ist. Man müsste sich das mal im Code angucken.
-
Inzwischen bekomme ich in Netbeans die Warnung, dass Vector veraltet sei ;O
-
UNd was soll man anstelle dann nehmen
-
Abgesehen jetzt davon ob die LinkedList langsamer ist beim reinen Kopieren, hast du sie versucht?
Wenn ja, wie verhält sich dein Programm.
Wenn nein, müsst du uns mehr liefern, evtl Programmcode.
-
Fischkopf2009 schrieb:
UNd was soll man anstelle dann nehmen
Ich könnte mir Collections.synchronizedList() vorstellen.
MfG SideWinder
-
Oh das kenne ich gar nicht
-
Das ist nur gut, wenn dein Programm nebenläufig ist o.O
-
Und wenn nicht, reicht die normale (hier schon mehrfach erwähnte) ArrayList.
-
SG1 schrieb:
Und wenn nicht, reicht die normale (hier schon mehrfach erwähnte) ArrayList.
Die hat der Threadstarter schon im sein Startpost benutzt.