Datentypen Welche Methode hat die bessere Performance?

goldmensch

Mitglied
Hey, ich hatte mich letzte Zeit bisschen mit der Performance Optimierung von Java beschäftigt. Und hab eine Methode bisschen abgewandelt. Jetzt ist meine Frage welche die bessere Performance hat und ob sich der Aufwand überhaupt gelohnt hätte (Hätte mich das Thema nicht einfach mal interessiert). Ein Profiler kann ich schwer nutzen da es sich um ein Plugin für Spigot (Minecraft Server) handelt. Vllt könnt ihr mir ja auch so weiterhelfen :) Edit: Was ich vergessen hatte anzumerken ist, das data.getCoLeader bzw data.getMember bei jedem aufruf eine ganze Config aus einer HashMap läd und aus dieser eine bestimmte StringListe zurückgibt.
[CODE lang="java" title="ohne optimierung"]public List<String> getClanInfo(String clan) {
List<String> info = new ArrayList<String>();
List<String> membernames = new ArrayList<String>();
List<String> coleadernames = new ArrayList<String>();
String friendlyfire;

for(String uuid : data.getCoLeaders(clan)) {
coleadernames.add(Bukkit.getOfflinePlayer(UUID.fromString(uuid)).getName());
}

for(String uuid : data.getMembers(clan)) {
membernames.add(Bukkit.getOfflinePlayer(UUID.fromString(uuid)).getName());
}

if(Boolean.valueOf(data.getClanData(clan, "friendlyfire").toString()) == true) {
friendlyfire = "§cenable";
}else {
friendlyfire = "§adisable";
}

info.add(messages.getPrefix() + "§6----------------ClanInfo---------------");
info.add(messages.getPrefix() + "§8name: §7" + clan);
info.add(messages.getPrefix() + "§8description: §7" + data.getClanData(clan, "description"));
info.add(messages.getPrefix() + "§8leader: §7" + Bukkit.getOfflinePlayer(UUID.fromString(data.getClanData(clan, "leader").toString())).getName());
info.add(messages.getPrefix() + "§8friendlyfire: " + friendlyfire);
info.add(messages.getPrefix() + "§8public: §7" + data.isPublic(clan));
info.add(messages.getPrefix() + "§8coleader: §7" + coleadernames);
info.add(messages.getPrefix() + "§8members: §7" + membernames);
info.add(messages.getPrefix() + "§6----------------ClanInfo---------------");
return info;[/CODE]

[CODE lang="java" title="mit optimierung"]public String[] getClanInfo(String clan) {
final String[] info = new String[9];
final String[] coleader_uuids = data.getCoLeaders(clan).toArray(new String[0]);
final String[] member_uuids = data.getMembers(clan).toArray(new String[0]);
final String[] membernames = new String[member_uuids.length];
final String[] coleadernames = new String[coleader_uuids.length];
String friendlyfire;

final int j_coleader = coleader_uuids.length;
for(int i = 0; i < j_coleader; i++) {
coleadernames = Bukkit.getOfflinePlayer(UUID.fromString(coleader_uuids)).getName();
}

final int j_member = member_uuids.length;
for(int i = 0; i < j_member; i++) {
membernames = Bukkit.getOfflinePlayer(UUID.fromString(member_uuids)).getName();
}

if((Boolean)data.getClanData(clan, "friendlyfire") == true) {
friendlyfire = "§cenable";
}else {
friendlyfire = "§adisable";
}

info[0] = messages.getPrefix() + "§6----------------ClanInfo---------------";
info[1] = messages.getPrefix() + "§8name: §7" + clan;
info[2] = messages.getPrefix() + "§8description: §7" + data.getClanData(clan, "description");
info[3] = messages.getPrefix() + "§8leader: §7" + Bukkit.getOfflinePlayer(UUID.fromString(data.getClanData(clan, "leader").toString())).getName();
info[4] = messages.getPrefix() + "§8friendlyfire: " + friendlyfire;
info[5] = messages.getPrefix() + "§8public: §7" + data.isPublic(clan);
info[6] = messages.getPrefix() + "§8coleader: §7" + Arrays.toString(coleadernames);
info[7] = messages.getPrefix() + "§8members: §7" + Arrays.toString(membernames);
info[8] = messages.getPrefix() + "§6----------------ClanInfo---------------";
return info;
}[/CODE]
 

LimDul

Top Contributor
Ich sehe nicht, wo das schneller sein soll.

Sind die gleichen Aufrufe - auch bei der foreach Schleife wird die Methode getCoLeaders nur 1x aufgerufen.
 

LimDul

Top Contributor
String Array ist sicher schneller als ArrayList<String>.
Definiere schneller. Ich behaupte nein, es ist nicht schneller in einem praktischen Sinne.

Hier mal ein sehr alter Stackoverlow beitrag:
Although the answers proposing to use ArrayList do make sense in most scenario, the actual question of relative performance has not really been answered.

There are a few things you can do with an array:

  • create it
  • set an item
  • get an item
  • clone/copy it

General conclusion​

Although get and set operations are somewhat slower on an ArrayList (resp. 1 and 3 nanosecond per call on my machine),

Eine Arraylist, die man direkt mit der richtigen Größe spezifiziert ist nicht sinnvoll messbar langsamer.
 
K

kneitzel

Gast
Also die Zugriffe sind bei beidem (Array und ArrayList) O(1), denn die ArrayList hat auch nur eine Array. Daher ist da nur ein minimaler Overhead durch die Zugriffe weil da paar Befehle drumherum sind.

Und beim Einfügen kann es zu zusätzlichem Aufwand kommen, da ein neues, größeres Array erstellt werden muss.

Aber die Diskussion ist nicht wirklich zielführend. Hier wird eine Optimierung besprochen. Zu Optimierungen kann ich nur sagen:
Rules of Optimization:
Rule 1: Don’t do it.
Rule 2 (for experts only): Don’t do it yet.

Daher: praktisch gewinnst Du nichts an Performance. Wenn diese Optimierung wichtig war, dann hast Du ein generelles Design-Problem! Da geht es um minimale Unterschiede - da wäre dann die Frage: Wenn Do so harte Anforderungen hast: Ist das nicht schon eine Anforderung, da RT Lösungen zu bauen? Oder wenigstens eine Lösung, wo andere Threads nicht plötzlich Performance brauchen (z.B. der GC)

Und wenn Performance optimiert werden müsste, dann wäre immer die Frage: Kann ich die Logik verändern? Also ich könnte darauf verzichten, dass die da jetzt diese Listen erzeuge, weil ich sicher stelle, dass die Informationen immer direkt nutzbar vorliegen. (Dann spart man hier, aber es kostet ggf mehr, Daten zu ändern ... ==> Ohne Analyse und genaue Anforderungen keine Optimierung!)

Edit: "(Array und ArrayList)" eingefügt im ersten Satz - denn darum geht es. Die Methoden selbst haben natürlich kein O(1) :)
 
Zuletzt bearbeitet von einem Moderator:

httpdigest

Top Contributor
Bei Optimierungen sollte man immer folgendermassen vorgehen:

1. das gesamte Programm (nicht nur diese eine kleine Methode) unter Realbedingungen messen!
2. eventuelle Performanceengpässe anhand der Messdaten identifizieren, die auch einen nennenswerten Anteil an der Gesamtlaufzeit haben)
3. mögliche Anpassungen für eine eventuelle Optimierung identifizieren
4. Anpassungen einbauen
5. nochmal das gesamte Programm unter Realbedingungen messen
6. validieren, ob die Optimierung für das Programm überhaupt etwas gebracht hat
7. feststellen, dass das nicht der Fall war

Man _kann_ durchaus optimieren. Aber man sollte sich vorher darüber im Klaren sein, welches Ziel man damit genau erreichen möchte. Nur eine einzige Methode (unter vielen hunderten anderer Methoden im Callstack) isoliert zu betrachten, bringt höchstwarhscheinlich nichts, durch die vielen Intra-Methoden-Optimierungen der JVM (inlining, escape analysis, stack replacement), die im Zusammenspiel mit dem gesamten Callstack ganz andere Effekte haben können.

Alles steht und fällt aber eben mit einer korrekten Messmethodik, die eben für das betrachtete Programm auch eine Aussage darüber treffen kann, ob die Performanceoptimierungen überhaupt etwas gebracht haben.
 

goldmensch

Mitglied
ich wollte allgemein nur mal schauen wie das so in Java ist alles. Deswegen auch nur diese eine Methode, es war nur zum testen und aus spaß. Ich werde mein Code nicht optimieren da es nicht sinnvoll ist. Wollte nur mal so schauen, ob das nen Unterschied machen würde. Trotzdem danke für alle Antworten :)
 

LimDul

Top Contributor
Definiere praktisch.
So, dass es messbar im Gesamtprogramm was bringt. Wie schon von den Vorrednern geschrieben - Performance Optimierungen ohne das eine sinnvolle Messmethodik habe, sind meist kontraproduktiv.

Und die Stelle zu optimieren bringt - bezogen auf das Gesamtprogramm - nichts, das geht im Rauschen und der Messungenauigkeit drunter. Das ist so sinnvoll wie bei einem 40-Tonner ein Milligramm an Gewicht durch Verwendung eines anderen Sitzbezuges zu sparen um damit Sprit zu sparen.
 

White_Fox

Top Contributor

Ich glaube, zum Thema Optimieren in Hochsprachen sollte man mal etwas ausführlicheres schreiben, damit weniger angehende Entwickler weniger Zeit vertrödeln.
 

goldmensch

Mitglied
Also die Zugriffe sind bei beidem (Array und ArrayList) O(1), denn die ArrayList hat auch nur eine Array. Daher ist da nur ein minimaler Overhead durch die Zugriffe weil da paar Befehle drumherum sind.

Und beim Einfügen kann es zu zusätzlichem Aufwand kommen, da ein neues, größeres Array erstellt werden muss.

Aber die Diskussion ist nicht wirklich zielführend. Hier wird eine Optimierung besprochen. Zu Optimierungen kann ich nur sagen:


Daher: praktisch gewinnst Du nichts an Performance. Wenn diese Optimierung wichtig war, dann hast Du ein generelles Design-Problem! Da geht es um minimale Unterschiede - da wäre dann die Frage: Wenn Do so harte Anforderungen hast: Ist das nicht schon eine Anforderung, da RT Lösungen zu bauen? Oder wenigstens eine Lösung, wo andere Threads nicht plötzlich Performance brauchen (z.B. der GC)

Und wenn Performance optimiert werden müsste, dann wäre immer die Frage: Kann ich die Logik verändern? Also ich könnte darauf verzichten, dass die da jetzt diese Listen erzeuge, weil ich sicher stelle, dass die Informationen immer direkt nutzbar vorliegen. (Dann spart man hier, aber es kostet ggf mehr, Daten zu ändern ... ==> Ohne Analyse und genaue Anforderungen keine Optimierung!)

Edit: "(Array und ArrayList)" eingefügt im ersten Satz - denn darum geht es. Die Methoden selbst haben natürlich kein O(1) :)
also bringt es an sich wenig, Java Programme zu optimieren?
 
K

kneitzel

Gast
also bringt es an sich wenig, Java Programme zu optimieren?
Generell bringt eine Optimierung wenig. Wenn es ein Problem gibt, dann muss man das Problem analysieren um dann das Problem selbst lösen zu können.

Aber so blinde Optimierungen bringen nichts, daher sollte man davon die Finge lassen. Da ist die Gefahr eher gegeben, dass man unleserlichen Code schreibt.

Aber man sollte seine Werkzeuge kennen, also z.B. die ganzen Collections. So kann man brauchbare Collections für die notwendigen Operationen auswählen. Mann kann auch uneffektive Dinge bleiben lassen. Das wäre dann das Buch "Effective Java", das ich empfehlen würde.
Aber ganz wichtig: Da geht es nicht um eine Optimierung, damit Code schneller läuft sondern da geht es einfach nur generell darum, wie man besseren Code schreiben kann.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R LinkedList und Threads - welche Methode ist besser? Allgemeine Java-Themen 2
S Vererbung: Welche Methode wird verwendet? Allgemeine Java-Themen 9
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
P Feststellen, Welche Classes ich aus einem JAR nutze? Allgemeine Java-Themen 6
H Apache fop -- welche Möglichkeit gibt es um den Fortschritt anzuzeigen (Progressbar) Allgemeine Java-Themen 5
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
F Java Web App - welche Technologien? Allgemeine Java-Themen 11
S Welche API? Allgemeine Java-Themen 6
B Klassen Objekt erzeugen und Konstruktor aufrufen - Welche Lösung ist besser? Allgemeine Java-Themen 2
K Welche Zertifizierung passt? Allgemeine Java-Themen 10
A Variable, welche Exeption wirft als "Global" deklarieren Allgemeine Java-Themen 13
J Videokonferenz mittel Java ? Welche Möglichkeiten habe ich ? Allgemeine Java-Themen 2
J Welche Layouts benutzt ihr? Allgemeine Java-Themen 2
G Wiedereinstieg, welche Java Version empfehlt ihr Allgemeine Java-Themen 7
M Welche Exceptionbehandlung ist sinnvoll? Allgemeine Java-Themen 3
H NetBeans geotools 15 oder 16 - welche Abhängingkeiten gibt es? Welche Jars brauche ich? Allgemeine Java-Themen 4
S Welche Java Techologien gibt es fürs Frontend Allgemeine Java-Themen 4
S Welche Nutzen bringen Lamda Expressions? Allgemeine Java-Themen 1
M Welche Umgebung und Frameworks für mich als Umsteiger Allgemeine Java-Themen 6
C Welche Styleconvention Allgemeine Java-Themen 0
ruutaiokwu datenstruktur welche sich "im kreis" dreht Allgemeine Java-Themen 26
F Welche Systeme für hoch skalierbare Webanwendung? Allgemeine Java-Themen 7
Landei Welche Klassen fehlen im JDK? Allgemeine Java-Themen 18
P Check, welche Java Version installiert bevor ein Programm ausgeführt wird. Allgemeine Java-Themen 12
G Welche Datenstruktur? Allgemeine Java-Themen 19
I Webseite auslesen (welche mittels Javascript Inhalt einbindet) Allgemeine Java-Themen 4
R Welche waren eure ersten Projekte? Allgemeine Java-Themen 10
G Wie kann man sehen, welche Applikationen mit java arbeiten? Allgemeine Java-Themen 17
L Social Media Webportal -> Welche Technologie (JEE, GWT) Allgemeine Java-Themen 8
J Welche Informationen werden beim Kompilieren gespeichert? Allgemeine Java-Themen 3
S Welche Datenstruktur für verschiedene Sprachen sinnvoll? Allgemeine Java-Themen 2
I Swing Welche Swing Komponente soll ich nehmen? Allgemeine Java-Themen 2
vladimir Welche API für Grafik und Drag&Drop Allgemeine Java-Themen 3
schlingel Plugin-Architektur - Welche nehmen? Allgemeine Java-Themen 6
U Welche 2D-API? Allgemeine Java-Themen 4
M Welche Dateiformate kann Java einlesen?? Allgemeine Java-Themen 26
E Neues Projekt - Welche GUI / IDE /Techniken / etc. Allgemeine Java-Themen 14
E Welche Icons für sichtbar /unsichtbar Allgemeine Java-Themen 2
J Welche Lösung für Servlets und JSPs in Eclipse? Allgemeine Java-Themen 5
N Für welche Art von Berechnungen macht JCUDA Sinn? Allgemeine Java-Themen 12
A Welche Exception verwenden? Allgemeine Java-Themen 2
T Welche Art von Hilfe?? Allgemeine Java-Themen 5
N welche run.bat? Allgemeine Java-Themen 3
R Assoziativer Speicher welche Unterschiede? Allgemeine Java-Themen 5
Developer_X Welche Dateien kann Java laden? Allgemeine Java-Themen 9
G Welche Schreibeweise ist richtig Allgemeine Java-Themen 16
ARadauer welche java version wird benutzt Allgemeine Java-Themen 4
E Welche Java-Version kennt isEmpty() ? Allgemeine Java-Themen 2
F Welche dicken Java-Bücher kennt ihr? Allgemeine Java-Themen 31
M Prüfen, welche anderen Programme laufen Allgemeine Java-Themen 5
K [erledigt] JVM welche läuft Allgemeine Java-Themen 9
G synchronized-Sclüsselwort: welche Reihenfolge zum Betreten? Allgemeine Java-Themen 6
E welche standalone Version von Tomcat benutzen? Allgemeine Java-Themen 6
S Welche Speicherung von Daten bei Kalendarfunktion der jtable Allgemeine Java-Themen 7
F welche Datenstruktur? Allgemeine Java-Themen 9
A feststellen, welche Klassen ein Interface implementieren Allgemeine Java-Themen 3
P welche jar enthält was? Allgemeine Java-Themen 5
F Welche Datenstruktur Allgemeine Java-Themen 2
V Welche Oberfläche empfehlt ihr mir? Allgemeine Java-Themen 19
Z Welche Datenstruktur verwende ich h_ier bloss ? Allgemeine Java-Themen 14
S Welche jar's werden wirklich benötigt?` Allgemeine Java-Themen 5
G Dateien löschen welche vor heute erstellt wurden? Allgemeine Java-Themen 7
G Prüfen welche JRE-Version gebraucht wird Allgemeine Java-Themen 19
I Welche Möglichkeiten bietet Java um Records in Dateien zu sp Allgemeine Java-Themen 10
B Drucken - welche Bibliothek favorisiert Ihr? Allgemeine Java-Themen 16
J Welche Daten für Ative-X Funktion? Allgemeine Java-Themen 5
P welche java version für javax.mail? Allgemeine Java-Themen 7
B Erkennen welche Objekte den Heap verbrauchen? Allgemeine Java-Themen 2
B Welche Java-Version? Allgemeine Java-Themen 7
S Welche Javaversion ist in meinem Linux? Allgemeine Java-Themen 2
M 2 Javaversionen welche aktiv? Allgemeine Java-Themen 3
C Datumsfelder auslesen - egal welche Zeitzone Allgemeine Java-Themen 2
F SuppressWarnings("xxx") - welche Möglichkeiten gib Allgemeine Java-Themen 4
R Welche Exception bei write() nehmen Allgemeine Java-Themen 7
reibi JVM fragen welche Apps geladen sind Allgemeine Java-Themen 7
L Welche Collection ist die richtige ? Listen mergen Allgemeine Java-Themen 3
S Welche Datenstruktur passt bei mir? Allgemeine Java-Themen 6
D Welche Datenstruktur? Allgemeine Java-Themen 2
B Grafische Oberfläche - Welche Komponenten? Allgemeine Java-Themen 5
T JMF, welche Codecs gibts, und vor allem, wo? Allgemeine Java-Themen 9
H Welche Scriptsprache verwendet ihr in Java Allgemeine Java-Themen 9
G Welche Referenzsoftware ist in Java geschrieben? Allgemeine Java-Themen 8
P Welche Collection verwenden? Allgemeine Java-Themen 4
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Simon16 compareTo Methode überschreiben Allgemeine Java-Themen 4
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
M CrudRepository save Methode mocken Allgemeine Java-Themen 6
thor_norsk toString() - Methode Allgemeine Java-Themen 6
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12

Ähnliche Java Themen

Neue Themen


Oben