14 Stimmen

Gibt es einen Leistungsunterschied zwischen inc(i) und i := i + 1 in Delphi?

Ich habe eine Prozedur mit einer Menge von

i := i +1;

darin und ich denke, dass

inc(i);

viel besser aussieht. Gibt es einen Leistungsunterschied oder wird der Funktionsaufruf einfach vom Compiler inline ersetzt? Ich weiß, dass das wahrscheinlich überhaupt keine Rolle für meine App spielt, ich bin nur neugierig.

BEARBEITEN: Ich habe die Leistung gemessen und festgestellt, dass der Unterschied sehr klein ist, tatsächlich so klein wie 5.1222741794670901427682121946224e-8! Es spielt also wirklich keine Rolle. Und Optimierungsoptionen haben das Ergebnis nicht viel verändert. Danke für alle Tipps und Vorschläge!

17voto

Jim McKeeth Punkte 37652

Es besteht ein großer Unterschied, wenn Overflow-Prüfung eingeschaltet ist. Grundsätzlich führt Inc keine Überlaufprüfung durch. Tun Sie, wie vorgeschlagen, und verwenden Sie das Disassembly-Fenster, um den Unterschied zu sehen, wenn Sie diese Compileroptionen eingeschaltet haben (es ist für jede einzelne anders).

Wenn diese Optionen ausgeschaltet sind, gibt es keinen Unterschied. Als Faustregel gilt, verwenden Sie Inc, wenn Ihnen ein Bereichsüberschreitungsfehler egal ist (da Sie keine Ausnahme erhalten!).

7voto

Burkhard Punkte 14363

Moderne Compiler optimieren den Code.
inc(i) und i:= i+1; sind praktisch dasselbe.

Verwenden Sie, was immer Sie bevorzugen.

Bearbeitung: Wie Jim McKeeth korrigiert hat: Mit Overflow-Überprüfung gibt es einen Unterschied. Inc führt keine Bereichsprüfung durch.

6voto

PatrickvL Punkte 4036

Es hängt alles vom Typ des "i" ab. In Delphi deklariert man normalerweise Schleifenvariablen als "i: Integer", aber es könnte genauso gut "i: PChar" sein, was sich auf PAnsiChar in allem unter Delphi 2009 und FPC auflöst (hier bin ich mir nicht sicher), und auf PWideChar in Delphi 2009 und Delphi.NET (auch hier bin ich mir nicht sicher).

Da Delphi 2009 Pointermathematik kann, kann Inc(i) auch auf typerierten Pointern gemacht werden (wenn sie mit POINTER_MATH definiert sind).

Zum Beispiel:

type
  PSomeRecord = ^RSomeRecord;
  RSomeRecord = record
    Value1: Integer;
    Value2: Double;
  end;

var
  i: PSomeRecord; 

procedure Test;
begin
  Inc(i); // Diese Zeile erhöht i um SizeOf(RSomeRecord) Bytes, dank POINTER_MATH !
end;

Wie die anderen Antworten bereits gesagt haben: Es ist relativ einfach zu sehen, was der Compiler aus Ihrem Code gemacht hat, indem Sie öffnen:

Ansichten > Debugfenster > CPU-Fenster > Disassembly

Beachten Sie, dass Compileroptionen wie OPTIMIZATION, OVERFLOW_CHECKS und RANGE_CHECKS das Endergebnis beeinflussen können, daher sollten Sie darauf achten, dass die Einstellungen Ihren Vorlieben entsprechen.

Ein Tipp dazu: In jeder Einheit $INCLUDE eine Datei, die die Compileroptionen steuert, auf diese Weise verlieren Sie die Einstellungen nicht, wenn Ihre .bdsproj oder .dproj irgendwie beschädigt ist. (Schauen Sie sich den Quellcode des JCL für ein gutes Beispiel dafür an)

3voto

Ondrej Kelle Punkte 36511

Sie können es im CPU-Fenster während des Debuggens überprüfen. Die generierten CPU-Anweisungen sind in beiden Fällen gleich.

Ich stimme zu, dass Inc(I); besser aussieht, obwohl dies subjektiv sein kann.

Korrektur: Ich habe gerade dies in der Dokumentation für Inc gefunden:

"Auf einigen Plattformen kann Inc optimierten Code generieren, der besonders nützlich in Schleifen ist."

Es ist also wahrscheinlich ratsam, sich an Inc zu halten.

1voto

robsoft Punkte 5505

Sie könnten immer beide Code-Stücke schreiben (in separaten Verfahren), einen Haltepunkt im Code setzen und den Assembler im CPU-Fenster vergleichen.

Im Allgemeinen würde ich inc(i) dort verwenden, wo offensichtlich nur als Schleifen-/Index verwendet wird und + 1 dort, wo die 1 den Code erleichtern würde, (d. h. es könnte sich in Zukunft möglicherweise in eine andere ganze Zahl ändern) oder einfach lesbarer aus einem algorithmischen/spezifischen Standpunkt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X