it-swarm.com.de

Leistung: größer/kleiner als vs nicht gleich

Ich frage mich, ob es einen Leistungsunterschied gibt 

Prüfen, ob ein Wert größer/kleiner als ein anderer ist

for(int x = 0; x < y; x++); // for y > x

und

Prüfen, ob ein Wert nicht gleich ist

for(int x = 0; x != y; x++); // for y > x

und warum?

Außerdem: Was ist, wenn ich mit Null vergleiche, gibt es einen weiteren Unterschied?

Es wäre schön, wenn die Antworten auch eine verschlüsselte Sicht auf den Code enthalten.

EDIT: Wie die meisten von Ihnen darauf hingewiesen haben, ist der Leistungsunterschied natürlich vernachlässigbar, aber ich interessiere mich für den Unterschied auf der CPU-Ebene. Welche Operation ist komplexer? 

Für mich ist es eher eine Frage, die Technik zu lernen/zu verstehen. 

Ich habe das Java-Tag entfernt, das ich aus Versehen hinzugefügt habe, weil die Frage im Allgemeinen nicht nur auf Java basiert, sorry.

27
das Keks

Sie sollten dennoch das tun, was klarer, sicherer und verständlicher ist. Diese Micro-Tuning-Diskussionen sind normalerweise eine Zeitverschwendung, weil

  • sie machen selten einen messbaren Unterschied
  • wenn sie einen Unterschied machen, kann sich dies ändern, wenn Sie eine andere JVM oder einen anderen Prozessor verwenden. ohne Vorwarnung.

Hinweis: Die generierte Maschine kann sich auch mit dem Prozessor oder der JVM ändern. Dies ist in den meisten Fällen nicht sehr hilfreich, selbst wenn Sie mit dem Montagecode sehr vertraut sind.

Viel, viel wichtiger ist die Wartbarkeit der Software.

24
Peter Lawrey

Die Leistung ist absolut vernachlässigbar . Hier ist ein Code, um es zu beweisen:

public class OpporatorPerformance {
    static long y = 300000000L;

    public static void main(String[] args) {
        System.out.println("Test One: " + testOne());
        System.out.println("Test Two: " + testTwo());
        System.out.println("Test One: " + testOne());
        System.out.println("Test Two: " + testTwo());
        System.out.println("Test One: " + testOne());
        System.out.println("Test Two: " + testTwo());
        System.out.println("Test One: " + testOne());
        System.out.println("Test Two: " + testTwo());

    }

    public static long testOne() {
        Date newDate = new Date();
        int z = 0;
        for(int x = 0; x < y; x++){ // for y > x
            z = x;
        }
        return new Date().getTime() - newDate.getTime();
    }

    public static long testTwo() {
        Date newDate = new Date();
        int z = 0;
        for(int x = 0; x != y; x++){ // for y > x
            z = x;
        }
        return new Date().getTime() - newDate.getTime();
    }

}

Die Ergebnisse:

Test One: 342
Test Two: 332
Test One: 340
Test Two: 340
Test One: 415
Test Two: 325
Test One: 393
Test Two: 329
15
James Dunn

Es gibt selten einen Performance-Hit, aber der erste ist viel zuverlässiger, da er beide außergewöhnlichen Fälle behandeln wird 

  1. y <0 zum Starten 
  2. x oder y werden innerhalb des Blocks durcheinander gebracht.
4
OldCurmudgeon

Andere Leute scheinen aus einer gemessenen Perspektive geantwortet zu haben, aber von der Maschinenebene aus wären Sie an der Arithmetic Logic Unit (ALU) interessiert, die die mathematischen Bits eines "normalen Computers" handhabt. Es scheint ein ziemlich gutes Detail in Wie funktioniert weniger als und besser als auf einer logischen Ebene im Binärbereich? Für vollständige Details.

Aus einer rein logischen Ebene ist die kurze Antwort, dass es einfacher ist zu erkennen, ob etwas nicht etwas ist, als zu sagen, ob etwas relativ zu etwas ist, dass dies jedoch wahrscheinlich auf Ihrem Standard-PC oder -Server optimiert wurde, also Nur mit kleinen persönlichen Aufbauten wie Bordcomputern für Drohnen oder anderen Mikrotechnologien sind tatsächliche Gewinne wahrscheinlich.

0
aetherwalker