Was ist schneller? Zuweisung oder Vergleich?

Status
Nicht offen für weitere Antworten.

Dirt Devil

Mitglied
Hallo Leute,

wie schon im Titel dieses Threads genannt möchte ich gern wissen, was von dem Prozessor schneller abgearbeitet wird, Zuweisungen oder Vergleiche?
Ich möchte meine Programme nämlich so aufbauen, dass ich den Prozessor möglichst wenig auslaste, besonders bei Sortieralgorithmen, mit denen ich mich momentan beschäftige und bei denen Performance äußerst wichtig ist.

Ich bedanke mich schon mal für eure Antwort,
Dirt Devil
 
S

SlaterB

Gast
teste es doch einfach?
dürfte allerdings schwierig werden, vielleicht ist ja jeder Schleifenwechsel zigmal langsamer als ein Vergleich ;)

ich glaube, auf der Ebene ist man in Java falsch,

was für ein Vergleich überhaupt? ein String oder noch komplexeres Objekt zu vergleichen ist schon was anderes als int == int
 

Dirt Devil

Mitglied
Das ist ja das Problem: Messen geht immer schlecht...sind ja noch zig andere Prozesse die im Hintergrund laufen...die einzige Methode wäre, zuweisungen und vergleiche zu zählen, aber dann kenn ich immernoch nicht den geschwindigkeitsunterschied.

Um unsere Werte sinnvoll zu vergleichen, müssen wir ja bei einem Datentyp bleiben, sonst wären die ergebnisse ja nicht korrekt. Mir geht es eher darum, wie der Prozessor Zuweisungen und Vergleiche abarbeitet...

Deshalb stelle ich meine Frage etwas genauer:
bool = true;
if(bool == true)
Was davon ist schneller??
 

Marco13

Top Contributor
Auf jeden Fall würde man nicht
if (bool == true)
schreiben, sondern nur
if (bool)

Allerdings frage ich mich mehrere Dinge:
1. Warum testest du es nicht einfach?
2. Meinst du nicht, dass das auf veschiedenenen Prozessoren unterschiedlich ist?
3. Glaubst du, du könntest einen schnelleren Sortieralgorithmus entwickeln, als der von Collections.sort oder Arrays.sort?
4. Wie kannst du eine Zuweisung durch einen Vergleich "ersetzen"?
 

Hilefoks

Bekanntes Mitglied
Ich bin zwar nicht der Thread-Ersteller aber...

Marco13 hat gesagt.:
1. Warum testest du es nicht einfach?
Messen ist extrem kompliziert und fehleranfällig. Auch muss man die Messergebnisse richtig interpretieren und sicher stellen das keine Seiteneffekte das Messergebnis verfälschen. Im Allgemeinen gelingt dies nur mit erheblichen Kenntnissen der Materie.

Marco13 hat gesagt.:
2. Meinst du nicht, dass das auf veschiedenenen Prozessoren unterschiedlich ist?
Nicht unbedingt. Ein Beispiel: Die Shift-Operation ist auf allen Prozessoren schneller als eine arithmetische Berechnung. Allerdings sollte es keine Rolle spielen das der Programmierer in Java x*2 schreibt - den der Compiler (in anderen Fällen die Java-Runtime) kann dies optimieren. Durch die Java Runtime können hier erheblich mehr Optimierungen gemacht werden als bei klassischen Programmiersprachen. Auch kann dadurch für jeden Prozessor eine andere Optimierung gefunden und benutzt werden.

Marco13 hat gesagt.:
3. Glaubst du, du könntest einen schnelleren Sortieralgorithmus entwickeln, als der von Collections.sort oder Arrays.sort?
Ja. Die eingebauten Sortieralgorithmen sind nicht auf spezielle Bedürfnisse optimiert. Insbesondere wenn besonders große Datenmengen zu sortieren sind zeigen die eingebauten Sortierverfahren ein sehr schlechtes Laufzeitverhalten.

Marco13 hat gesagt.:
4. Wie kannst du eine Zuweisung durch einen Vergleich "ersetzen"?
Z.b. in dem man testet ob die Zuweisung nötig ist "if(b!=c) { b=c; }". Das das Sinn macht kann ich mir aber gerade nicht vorstellen. ;-)

MfG,
Hilefoks
 

ice-breaker

Top Contributor
Zuweisungen sind schneller als Vergleiche ;)
Du beschäftigst dich mit Sortieralgorithmen? Da haben doch schon schlaue Köpfe richtig gute Algorithmen (quickSort, HeapSort) die bewiesenermaßen die schnellsten Algorithmen sind
 

para_

Bekanntes Mitglied
4. Wie kannst du eine Zuweisung durch einen Vergleich "ersetzen"?
ersetzen vielleicht nicht, aber man kann den algorithmus ja so aufbauen dass er entsprechend weniger vergleiche oder weniger zuweisungen braucht (also das verhältnis sich ändert)
 
S

SlaterB

Gast
> die bewiesenermaßen die schnellsten Algorithmen sind

nur unter allgemeinen Annahmen,
wenn man dagegen bestimmte Randbedinungen bzl. Verteilung der Werte oder auch Aufwand des Vergleichs untereinander/ Aufwand des Ladens usw hat,
kann es ja ganz anders aussehen,

und selbst dann muss man ja nicht unbedingt vom besten Verfahren (MergeSort! ;) ) abweichen,
sondern es vielleicht nur an bestimmten Stellen modifizieren
 

Dirt Devil

Mitglied
Danke Hilefoks, du bringst mein Gedanken genau auf den Punkt.

Ich habe im Internet noch fleissig recherchiert und bin zu dem Punkt gekommen, dass Vergleiche prinzipiell schneller ablaufen als Zuweisungen.
Beispiel mit Langzahlen: Zuweisungen hängen nämlich immer linear vom Wert ab. Vergleiche allerdings prüfen nur anhand der ersten Stelle eines Wertes; und wenn die gleich sind, rückt er eine Stelle weiter. Also kann ein Vergleich in den meisten Fällen sehr schnell verlaufen, wenn anhand der ersten Ziffer schon erkannt werden kann, ob eine Zahl größer/kleiner/gleich ist, sonst ist er allerdings auch ,im schlechtesten Fall (wenn die Zahlen also gleich sind), linear vom Wert abhängig. (Quelle: www.ma.tum.de/~kaplan/ca/spock/praktika/UrSpock/node87.html )

Ich hoffe das stimmt, was ich da zusammengetragen habe :bae:
Noch besser wäre es, wenn man wissen würde, wie der Prozessor Vergleiche und Zuweisungen abarbeiten würde (also in Assembler)

MfG,
Dirt Devil
 
S

SlaterB

Gast
falls du dich nur auf die allgemeine Logik beziehst, muss dies nicht unbedingt stimmen,

böses Beispiel:
die Zuweisung mag vielleicht von der Länge abhängen,
dauert aber nur 1-9 Zeiteinheiten für Länge 1-9

dagegen ist der Vergleich zwar schon nach einer Ziffer fertig,
dieser Vergleich der ersten Ziffer dauert aber bereits 300 Zeiteinheiten,

daher: früher Abbruch ist immer gut, ganz ohne absolute Zahlen aber recht nutzlos
 

Ralf W. Balz

Mitglied
Hallo,

Dirt Devil hat gesagt.:
Noch besser wäre es, wenn man wissen würde, wie der Prozessor Vergleiche und Zuweisungen abarbeiten würde (also in Assembler)

*InTiefVergrabenerErinnerungStaubigenBüchernHüstel* in Assembler gibt es verschiedene Vergleichsbefehle CMP CMPS, CMPSB und und und. CMP zum Beispiel ist ein arithmetischer Vergleichsbefehl, der kurz gesagt zwei Werte von einander abzieht, man kann dann die verschieden Flags wie das Carry-Flag, Zero-Flag, Overflow-Flag.... auswerten, für das was man gerade braucht. Beispiel: wenn das Zero-Flag gesetzt ist, so ist das Ergebnis der Subtraktion 0, somit besteht Gleichheit der Werte. Oder das Parity-Flag ist gesetzt, das Ergebnis ist eine gerade Anzahl von Bits und und und. Wie gesagt, es gibt verschiedene Vergleichsbefehle die auch anders arbeiten und verschieden lang brauchen.

Was ich damit sagen möchte ist, dass man auch mit dem Wissen, wie das im Assembler geht, deine Frage meiner Meinung nach nicht genauer beantworten kann, weil ja nun noch Java dazwischen liegt und ein Betriebssystem, mit dem Java ja auch kooperieren muss *wegduck*, wie auch immer.

Ich denke, die Zeit messen für jedes Sortierverfahren auf ähnlichen Daten, die du sortieren möchtest, und das mehrmals und einen Mittelwert bilden ist das beste, wie man an ein brauchbares Ergebnis kommt bzw. herausfindet, welcher Sortieralgorithmus für diese Aufgabe der schnellste ist.

Grüße Ralf
 

Ice-Tea

Bekanntes Mitglied
Ich vertraue mal meinem halbwissen und erhebe auch mal das Wort.

Ich kann mir kaum vorstellen, das ein vergleich schneller ist als eine Zuwesung.
Vorallen bei Datenmengen, die nicht in den L2 Cache der CPU passen- wovon ich ausgehe...

Immerhin müssen bei Vergleichen min. 2 Daten aus dem Arbeitsspeicher gelesen werden und zusätzlich verglichen werden. Das ergebniss muss danach im Speicher auch wieder abgelegt werden.

Bei einer zuweisung wird allerdings nur ein Datentranfer von der CPU zum Speicher gebraucht. OK, Generell ist speichern langsamer als lesen, aber müssen wie gesagt min. 2 Daten gelesen werden.

Ich denke, dass das sehr Platformabhäghig ist. Der beste Algorythmus bring nichts wenn die Hardware es nicht richtig umsetzen kann...

PS: Am einfachsten ist es, einen neuen T2 von SUN zu erwerben, dann ist Algorythmus nur noch zweitrangig *joke*
PSS: Wenn es wirklich so kritisch ist, dann selbst Assamblen...

@Dirk Devil: Kommt auf die länge der vergleiche an und in wie weit man davon ausgehen kann das die werte Identisch, bzw. nicht idertisch sind. Sollte sich in vielen fällen nur die letzte Ziffer ändern, könnte es durchaus sehr langsam werden.
 
G

Guest

Gast
Zum Thema Performance:

It works, it run, it fast.

Sprich zuerst entwickeln, dann mal schauen ob Performance ausreicht, wenn nicht ueber neue Hardware nachdenken, wenn das nicht hilft ueber Codeoptimierung nachdenken (z.B Caching, etc.).. Spaetestens dann sollten alle Probleme weg sein ausser bei RealTime Anwendungen vielleicht...

Sprich schreib bloss nicht son scheiss wie

Code:
if (a!=b) {
    a=b
}
Denn dass kann doch kein schwein mehr lesen. Der Programmcode ist die Schnittstelle zum Menschen NICHT zur Machine....
 

para_

Bekanntes Mitglied
Anonymous hat gesagt.:
Sprich zuerst entwickeln, dann mal schauen ob Performance ausreicht, wenn nicht ueber neue Hardware nachdenken, wenn das nicht hilft ueber Codeoptimierung nachdenken (z.B Caching, etc.)..

Ich hoffe doch das ist nicht ernst gemeint... ???:L :?
 

Dirt Devil

Mitglied
@para: Hoff ich auch hehe:

@Ice-Tea: Deine Argumentation klingt für mich bisher am schlüssigsten. Ich denke, ich werde dies erst mal so übernehmen.
 

schalentier

Gesperrter Benutzer
Anonymous hat gesagt.:
It works, it run, it fast.

Recht hat er! Ein schneller, fehlerhafter Algorithmus ist tausend Mal schlechter, als ein langsamerer dafuer fehlerfreier und wartbarer.

Zum Testen: Schreib den Algo doch in 2 Versionen, einmal mit Vergleichen, einmal mit Zuweisungen (wie auch immer) und vergleich dann die Performance. Nimm am besten ein Profiler.
Aber ganz im Ernst, ich glaub kaum, dass du mit Vergleich/Zuweisung in Java irgendwas rausholen kannst. Viel wichtiger sind da die ueblichen Performancebremsen (Strings, ueberfluessige new XYZ(), unnoetige BigInteger, etc.).

Demnach sagt der Satz da oben nur, mach zuerst dein Algo fertig, so dass er funktioniert, weil der Code einfach, lesbar und wartbar ist. Danach kannste optimieren, wobei wenns wirklich auf die letzten 5% ankommt, sicher C/ASM die bessere Wahl waere.
 

Saxony

Top Contributor
Anonymous hat gesagt.:
[...]wenn nicht ueber neue Hardware nachdenken[...]

Hehe der Nichtschwimmer schiebt es auch immer auf die Badehose. :)

Naja in ASM würde ich entweder CMP oder XOR für Vergleiche verwenden.

Code:
XOR ax, bx
jnz ungleich // jump not zero
    hier gehts weiter wenn se gleich sind
jmp weitergehts
ungleich :
    mache irgendwas bei Ungleichheit
weitergehts :
    weiter im programm

Zuweisungen kommen dagegen ohne bedingte und unbedingte Sprünge aus

Code:
mov ax, bx

und müssten auf Maschinenebene ein paar Takte schneller sein.

In wie weit sich das alles auf komplexe Objekte ein paar Level nach oben auf Java übertragen lässt, bleibt allerdings offen.

bye Saxony
 

happy_robot

Bekanntes Mitglied
Saxony hat gesagt.:
Anonymous hat gesagt.:
[...]wenn nicht ueber neue Hardware nachdenken[...]

Hehe der Nichtschwimmer schiebt es auch immer auf die Badehose. :)

Naja in ASM würde ich entweder CMP oder XOR für Vergleiche verwenden.

Code:
XOR ax, bx
jnz ungleich // jump not zero
    hier gehts weiter wenn se gleich sind
jmp weitergehts
ungleich :
    mache irgendwas bei Ungleichheit
weitergehts :
    weiter im programm

Zuweisungen kommen dagegen ohne bedingte und unbedingte Sprünge aus

Code:
mov ax, bx

und müssten auf Maschinenebene ein paar Takte schneller sein.

In wie weit sich das alles auf komplexe Objekte ein paar Level nach oben auf Java übertragen lässt, bleibt allerdings offen.

bye Saxony

leider nicht ganz richtig .... :D

ein

Code:
mov ax,bx

entspricht wohl kaum einer zuweisung im gemeinten sinne. das würde nur stimmen wenn alle werte grundsätzlich in registern gehalten werden, was durch deren beschränktes vorkommen wohl auszuschliessen ist. . :lol:

bei einem vergleich werden eventuell mehrere 8- bis 64-bit - werte zwischen verschiedenen segmenten hin- und her transferiert. das dauert deutlich länger als ein XOR und der sprung mit jnz oder jne (hier gibts sogar minimale laufzeitunterschiede zwischen je und jne!)

ich vermute daß man davon ausgehen kann daß der vergleich schneller ist, da dort die wahrscheinlichkeit grösser ist daß zumindest einer der zu vergleichenden werte in einem register vorliegt. bei einer zuweisung kann man sich fast sicher sein daß dies nicht der fall ist, da diese in der regel im SS, DS oder ES gehalten werden. Bei einem Clone von grossen Datenmengen kommt dann wahrscheinlich zu Verschiebungen vom DS nach ES...und das ist nicht sonderlich performant gegenüber einem Vergleich.

mfg
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Dieses Programm schneller machen? Allgemeine Java-Themen 2
M Dateien schneller kopieren Allgemeine Java-Themen 1
D Eine Forschleife mit Threads abarbeiten um es zu schneller zu machen. Ist das möglich? Allgemeine Java-Themen 20
M While-Schleife schneller, solange die Abbruchbedingung nicht vom Schleifeninneren abhängt Allgemeine Java-Themen 3
B Threads Timer wird immer schneller Allgemeine Java-Themen 6
G Erste Schritte Aufgabe - Geht das auch schneller ? Allgemeine Java-Themen 7
X Images painten - Was ist schneller? Allgemeine Java-Themen 2
L Assoziatives Datenfeld, schneller wie Hashmap Allgemeine Java-Themen 35
B Input/Output Schneller Sort mit wenigen Zugriffen (oder was anderes?) Allgemeine Java-Themen 3
V Thread schneller stoppen Allgemeine Java-Themen 2
D NetBeans Programm in NetBeans deutlich schneller als als Jar Allgemeine Java-Themen 33
F ArrayList schneller als LinkedHashMap? Allgemeine Java-Themen 8
feuervogel Performanzprobleme - Code schneller machen Allgemeine Java-Themen 18
J Was ist schneller? Neue Variable oder neuer Wert speziell int Allgemeine Java-Themen 3
R Was ist schneller? Allgemeine Java-Themen 3
E Schneller Einstieg in Java und Web Services Allgemeine Java-Themen 3
C Wer kanns schneller? Allgemeine Java-Themen 13
M Was ist schneller und effizienter GZIP(java) oder 7zip ? Allgemeine Java-Themen 5
D Geht es auch schneller doppelte Einträge zu löschen? Allgemeine Java-Themen 23
B Vermeiden das JButton schneller hintereinander drücken Allgemeine Java-Themen 3
m@nu Thumbnails schneller erstellen Allgemeine Java-Themen 2
T Warum mein such-tool schneller als Windows such-tool? Allgemeine Java-Themen 5
A Wie mach ich, das mein Button schneller reagiert. Allgemeine Java-Themen 13
D binär einlesen schneller? Allgemeine Java-Themen 3
S Gehts schneller? Allgemeine Java-Themen 10
S Wert zuweisung Allgemeine Java-Themen 1
Killunox MaxHeap Zuweisung unter Linux funktioniert nicht Allgemeine Java-Themen 1
P Zuweisung verändert den Ausgangswert Allgemeine Java-Themen 7
A Observer Pattern: feuern bei neuer Referenz-Zuweisung? Allgemeine Java-Themen 8
Semox Fehler - Zuweisung aus BufferedReader an Variable Allgemeine Java-Themen 3
ARadauer zuweisung ergibt doch true, oder? Allgemeine Java-Themen 17
R ascii-wert zuweisung Allgemeine Java-Themen 4
T Problem mit Zuweisung von Objekten Allgemeine Java-Themen 5
Neumi5694 double Vergleich Allgemeine Java-Themen 19
M Vergleich C# und Java Allgemeine Java-Themen 24
D Vergleich OracleJDK/OpenJDK Allgemeine Java-Themen 7
T Komplexitätsoptimierung String vergleich Allgemeine Java-Themen 4
T If Vergleich ergibt nicht das richtige Ergebnis Allgemeine Java-Themen 2
K Vergleich von Strings von Objekten Allgemeine Java-Themen 4
E Problem mit Array vergleich Allgemeine Java-Themen 4
M Vergleich (unscharf) von Screenshots Allgemeine Java-Themen 0
L Vergleich-Xml-Daten Allgemeine Java-Themen 3
S BufferedImage vergleich mit Subimage Allgemeine Java-Themen 1
Z Vergleich zwischen int und Object Allgemeine Java-Themen 1
M Datums vergleich klappt überhaupt nicht.. Allgemeine Java-Themen 4
S Calendar vergleich Allgemeine Java-Themen 2
G Zeilenweiser Vergleich Allgemeine Java-Themen 10
E Vorschläge, effizientes Hashing von Dateien für vergleich Allgemeine Java-Themen 7
W Vergleich eines Datenträgers auf neue Dateien Allgemeine Java-Themen 14
C Vergleich von Enums gibt inkorrekte Werte Allgemeine Java-Themen 6
N Input/Output Vergleich von identischen Strings schlägt fehl Allgemeine Java-Themen 5
N Vergleich eigener Klassen Allgemeine Java-Themen 5
P J-Unit vergleich von 2 Objekten merkwürdig Allgemeine Java-Themen 7
K GUI-Button Inhalte vergleich - TicTacToe Grundriss Allgemeine Java-Themen 11
N Vergleich von generischen Typen Allgemeine Java-Themen 2
S String-Vergleich in if Allgemeine Java-Themen 7
P JNA - JNI - pures Java - Vergleich Allgemeine Java-Themen 6
I Vergleich zweier Felder Allgemeine Java-Themen 3
M Vergleich von TreeSet<HashSet>^2 Allgemeine Java-Themen 8
F Vergleich zweier Listen Allgemeine Java-Themen 4
U Java Performance im Vergleich zu C++ in speziellem Anwendungsfall Allgemeine Java-Themen 6
O String NICHT vergleich Allgemeine Java-Themen 7
G Vergleich von .jpg Dateien Allgemeine Java-Themen 2
I vergleich und zählen von Strings Allgemeine Java-Themen 7
K Vergleich von Icons . Allgemeine Java-Themen 8
N vergleich mit while und for schleife Allgemeine Java-Themen 7
M Vergleich im geordeten Vector und Methodenaufruf Allgemeine Java-Themen 2
minzel String in String (Vergleich) Allgemeine Java-Themen 2
J vergleich zweier datenstrukturen Allgemeine Java-Themen 6
P Vergleich: Java - .net Allgemeine Java-Themen 5
T Vergleich von Tastatureingabe mit dem was in der Datei steht Allgemeine Java-Themen 21
N Split -> IF-String vergleich Allgemeine Java-Themen 5
N Vergleich zweier Hashtable / mehrere Enumerations Allgemeine Java-Themen 7
C Performance Vergleich, Java vs. Tcl/Tk Allgemeine Java-Themen 3
B bit vergleich oder regex Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben