Welche ist schneller? Vergleich oder Zuordnung?
Mache ich eine bit-Codierung, wo ich dies Schreibe, sort code:
if( array[i]==false )
array[i]=true;
Frage ich mich, ob es sollte neu geschrieben werden als
array[i]=true;
Stellt sich die Frage: sind Vergleiche schneller als die Aufträge?
Was über die Unterschiede von Sprache zu Sprache? (Kontrast zwischen java & cpp, zB.)
HINWEIS: ich habe gehört, dass die "vorzeitige Optimierung ist die Wurzel allen übels." Ich glaube nicht, dass hier gilt 🙂
- es sei denn, Sie schreiben ein Programm für ein embedded-system mit einem sehr langsamen Prozessor, dann müssen Sie sich keine sorgen. Auch an diesem Punkt würden Sie nur ungern an der hand-optimieren
- Kann array[i] alles andere als ein bool? wenn nicht, dann wird der rewrite richtig ist.
- Ja, das array ist ein boolean-array.
- Zu jeder Buchung "Meinungen" auf, was ist schneller und warum, bitte aufhören. Der EINZIGE Weg, zu wissen, was schneller für einen bestimmten compiler auf einem bestimmten Prozessor ist es zum benchmark. Meinungen zählen nicht, wo etwas gemessen werden kann und getestet werden. Der Fragesteller ist dies nicht etwas zu befürchten, aber wenn es sein muss, dann testen Sie es über 1.000.000 Iterationen, erhalten durchschnittlich mal für mehrere Läufe, ändern Sie es und sehen, was der Unterschied ist. Theoretisch kann man schneller sein als die anderen, aber für einen primitiven Datentyp, werden Sie praktisch identisch.
- Worrier: Woher wissen Sie, dass 1000000 Iterationen ist die richtige Größe für das array? Mit modernen Prozessoren Vermeidung von cache-misses ist der wichtige Teil, nicht mitgerechnet instruction cycles. So sollte das benchmark laufen mit realistischen Daten Größe.
- Ähnlicher thread mit Antworten: stackoverflow.com/q/23228359/632951
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, da Sie sagen, Sie sind sicher, dass diese Fragen, die Sie sollten schreiben Sie einfach ein Programm testen und Messen um den Unterschied zu finden.
Vergleich schneller sein können, wenn dieser code ausgeführt wird, auf mehrere Variablen zugewiesen wird, verstreut Adressen im Speicher. Mit Vergleich ist, den Sie liest nur Daten aus dem Speicher in den Prozessor-cache, und wenn Sie nicht ändern Sie den Wert der Variablen, wenn der cache entscheidet zu Spülen, um die Linie zu sehen, dass die Zeile nicht geändert wurde und es gibt keine Notwendigkeit, es zu schreiben zurück in den Speicher. Dies beschleunigt die Ausführung.
Dies ist nicht nur vorzeitige Optimierung, das ist Mikro-Optimierung, das ist eine irrelevante Ablenkung.
Vorausgesetzt das array ist vom Typ boolean dann dein Vergleich ist unnötig, was ist die einzig relevante Beobachtung.
Edit: ich habe ein script geschrieben in PHP. Ich habe gerade festgestellt, dass es einen eklatanten Fehler in der it Bedeutung der best-case-Laufzeit wurde falsch berechnet (beängstigend, dass niemand sonst bemerkt!)
Besten Fall nur beats geradezu Zuordnung aber schlimmsten Fall ist ein noch viel schlimmer als einfache Zuweisung. Die Zuordnung ist wahrscheinlich die Schnellste in Bezug auf real-world-Daten.
Ausgabe:
Code:
Ich glaube, wenn Vergleich und Zuordnung Aussagen sind Atomare(d.h. ein-Prozessor-Anweisung) und führt die Schleife n-mal, dann ist der worst-case vergleicht, dann zuweisen würde erfordern, n+1(Vergleich der bei jeder iteration plus Einstellung der Tätigkeit) Hinrichtungen in der Erwägung, dass ständig asssigning bool erfordern würde, die n-Ausführungen. Daher ist die zweite die effizientere ist.
Hängt von der Sprache ab. Allerdings Durchlaufen von arrays kann teuer werden als gut. Wenn das array in aufeinanderfolgenden Speicher, der Schnellste zu schreiben 1 bit (255s) über den gesamten array mit memcpy vorausgesetzt, Ihre Sprache/compiler kann dies tun.
Erbringen somit 0 mal gelesen-1 schreiben insgesamt, kein Lesen/schreiben der Schleife eine variable/array-variable (2 liest/2 schreibt jeder Schleife) mehrere hundert mal.
memset
eher alsmemcpy
...Ich wirklich nicht erwarten würde es zu sein, jede Art von spürbaren performance-Unterschied für so etwas triviales wie das so sicherlich kommt es darauf an, was Ihnen klarer, lesbarer code. Ich bin der Meinung, dass wäre immer zuweisen wahr.
Könnte einen Versuch Wert:
Aber wirklich der einzige Weg, um sicher wissen, ist zu Profil, ich bin mir sicher, dass so ziemlich jeder compiler würde der Vergleich false als unnötig und optimieren Sie es aus.
Kommt es auf den Datentyp an. Die Zuweisung Boolesche Werte schneller als im ersten Vergleich. Aber das kann nicht wahr sein, für größere Werte-basierten Datentypen.
Wie andere bemerkt haben, ist diese Mikro-Optimierung.
(In der Politik oder Journalismus, das ist bekannt als Nabelschau 😉
Ist das Programm groß genug, um mehr als ein paar Schichten von Funktion/Methode/subroutine aufruft?
Wenn das so ist, es hatte wohl einige vermeidbare Anrufe, und diejenigen, die verschwenden können, Hunderte so viel Zeit, wie low-level-Ineffizienzen.
Auf der Annahme, dass Sie entfernt die (was einige Leute tun), dann führen Sie es 10^9 mal unter eine Stoppuhr, und sehen, welche schneller ist.
Warum würden Sie sogar schreiben der ersten version? Was ist der nutzen, zu überprüfen, um zu sehen, wenn etwas falsch ist, bevor Sie es wahr. Wenn du immer einstellen, es gilt dann immer es wahr.
Wenn Sie einen performance-Engpass haben, dass Sie Rückschlüsse auf die Einstellung eines einzelnen booleschen Wert unnötig, kommen Sie wieder und sprechen Sie uns an.
Ich erinnere mich, in einem Buch über die assembly-Sprache, die der Autor behauptet, dass die if-Bedingung sollte sein vermieden, wenn möglich.
Es ist viel langsamer, wenn die Bedingung false ist, und die Ausführung muss springen zu einer anderen Linie, erheblich verlangsamt die performance. Auch da Programme ausgeführt werden, in Maschinen-code, ich denke 'wenn' ist langsamer als jede (kompilierte) Sprache ist, wenn seine Bedingung wahr ist fast die ganze Zeit.
Wenn Sie nur spiegeln wollen, die Werte, dann tun:
Leistung mit das ist eigentlich noch schlimmer, denn anstatt nur mit einer einzigen Prüfung für ein true Wert false, dann Einstellung, überprüft es zweimal.
Wenn Sie deklarieren ein 1000000-element-array, true,false, true,false Muster Vergleich langsamer ist. (var b = !b) im wesentlichen eine überprüfung zweimal statt einmal