Frage

Hier kann sagen, wir haben eine negative ganze Zahl sagen int a;

gibt es eine schnellere Umsetzung von -a?

Muss ich eine bitweise Operation auf, dies zu tun?

War es hilfreich?

Lösung

Um Pax Aussage,

zu klären

C ++ Compiler sind nicht zu verwenden, Zweier-Komplement beauftragt, außer in 1 Fall. Wenn Sie eine signierte Typ ohne Vorzeichen Typen umwandeln, wenn die Zahl negativ ist, muss das Ergebnis der Umwandlung der Komplement-Darstellung der ganzen Zahl von 2 sein.

Kurz gesagt, gibt es keine schnellen Weg, als -a; selbst wenn es gab, wäre es nicht tragbar sein. Beachten Sie auch, dass eine vorzeitige Optimierung ist böse. Profil Ihren Code zuerst und dann die Arbeit an den Engpässen.

Siehe Die C ++ Programmiersprache, 3. Aufl. , Abschnitt C.6.2.1.

Andere Tipps

Es ist mit ziemlicher Sicherheit nichts schneller als der Maschinencode NEG-Befehl, der Compiler wird höchstwahrscheinlich diese in drehen.

Wenn es, ich bin sicher, dass der Compiler verwenden würde.

Für eine Zweier-Komplement-Zahl, könnten Sie es nicht und fügen Sie 1, aber das ist fast sicher langsamer sein würde. Aber ich bin mir nicht ganz sicher, dass die C / C ++ Standards Mandat der Einsatz von Zweier-Komplement (sie können, habe ich nicht überprüft).

Ich denke, diese Frage mit denen gehört, die neu zu schreiben versuchen strcpy() et al, um mehr Geschwindigkeit zu bekommen. Diese Menschen gehen davon aus, dass die naiv-C-Bibliothek strcpy() nicht bereits stark optimiert durch den Einsatz spezieller Maschinencodeanweisungen (statt einer simplen Schleife, die die meisten Menschen den ersten Versuch wäre).

Haben Sie Performance-Tests durchführen, die scheinen zu zeigen, dass Ihre Negationen eine zu lange Zeit nehmen?

    A NEG auf 486 (Stand der Technik das letzte Mal, dass ich Angst hatte zu etwa Taktzyklen) 3 Taktzyklen (Memory Version nimmt, registrieren dauert nur 1) - Ich bin die späteren Chips angenommen wird ähnlich. Auf einem 3GHz CPU, bedeutet, dass Sie 1 tun Milliarden diese jede Sekunde. Ist das nicht schnell genug?

Haben Sie schon einmal den Begriff „vorzeitige Optimierung“ gehört? Wenn Sie noch optimiert alle des Codes, und das ist das einzige, was noch, in Ordnung. Wenn nicht, Sie verschwenden Ihre Zeit.

eine Reihe Negieren ist eine sehr einfache Operation in Bezug auf die CPU-Hardware. Ich bin mir nicht bewusst, einen Prozessor, der länger dauert Negation zu tun, als jede bitweise Operation zu tun - und das schließt einige 30 Jahre alte Prozessoren

.

Einfach nur neugierig, was Sie führte diese Frage zu stellen? Es war sicherlich nicht, weil Sie einen Engpass erkannt.

Vielleicht sollten Sie darüber nachdenken, Ihre Algorithmen stärker als kleine Dinge wie diese zu optimieren. Wenn dies das letzte, was zu optimieren, Ihr Code so schnell wie es geht zu erhalten.

Alle guten Antworten.

Wenn (-a) einen Unterschied macht, haben Sie bereits einige wirklich aggressive Performance-Tuning durchgeführt.

Performance-Tuning ist ein Programm wie das Wasser immer aus einem nassen Schwamm. Als ein Programm zum ersten Mal geschrieben wird, ist es ziemlich nass. Mit ein wenig Aufwand können Sie einige Zeit aus ihm heraus auspressen. Mit mehr Aufwand können Sie es trocknen einige mehr aus.

Wenn Sie wirklich persistent sind, können Sie es nach unten, wo Sie es in der heißen Sonne setzen müssen, um aus ihm die letzten paar Moleküle Zeit zu erhalten.

Das ist die Ebene, auf der (-a) könnte einen Unterschied machen.

Sind Sie sehen ein Leistungsproblem mit Zahlen zu negieren? Ich habe eine harte Zeit zu denken, dass die meisten Compiler würde eine bitweise op gegen ganze Zahlen tun, um sie zu negieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top