Gibt es Leistungsunterschiede bei der Verwendung von int im Vergleich zu int8_t

8

Meine Hauptfrage ist Gibt es einen Unterschied zwischen int und int8_t für die Ausführungszeit ?

In einem Framework, an dem ich gerade arbeite, lese ich oft Code, bei dem einige Parameter als int8_t in function gesetzt sind, weil "dieser bestimmte Parameter nicht außerhalb des Bereichs von -126,125 liegen kann".

An vielen Stellen wird int8_t für das Kommunikationsprotokoll verwendet oder um ein Paket in viele Felder in ein __attribute((packed)) struct zu schneiden.

Aber irgendwann wurde es hauptsächlich dort eingefügt, weil jemand dachte, es wäre besser, einen Typ zu verwenden, der der Größe der Daten besser entspricht, wahrscheinlich vor dem Compiler zu denken.

Wenn man bedenkt, dass der Code unter Linux läuft, mit gcc mit glibc kompiliert wird und Speicher oder Portabilität kein Problem ist, frage ich mich, ob es tatsächlich eine gute Idee ist, was die Leistung angeht.

Mein erster Eindruck kommt von der Regel "Der Versuch, schlauer zu sein als der Compiler, ist immer eine schlechte Idee" (es sei denn, Sie wissen, wo und wie Sie optimieren müssen).

Allerdings weiß ich nicht, ob die Verwendung von int8_t tatsächlich einen Kostenfaktor für die Leistung darstellt (mehr Tests und Berechnungen zur Übereinstimmung mit der int8_t -Größe, mehr Operationen sind erforderlich, um sicherzustellen, dass die Variable nicht außerhalb der Grenzen bleibt usw.) ) oder wenn es die Leistung in irgendeiner Weise verbessert.

Ich bin nicht gut darin, einfach asm zu lesen, also habe ich keinen Testcode in asm kompiliert, um zu wissen, welcher besser ist.

Ich habe versucht, eine verwandte Frage zu finden, aber bei allen Diskussionen, die ich bei int<size>_t versus int gefunden habe, geht es eher um Portabilität als um Leistung.

Danke für Ihre Eingabe. Assembly Beispiele erklärt oder Quellen zu diesem Thema würden sehr geschätzt werden.

    
DainDwarf 04.02.2015, 09:03
quelle

2 Antworten

7

int entspricht im Allgemeinen der Größe des Registers auf der CPU. Der C-Standard besagt, dass alle kleineren Typen in int konvertiert werden müssen, bevor Operatoren für sie verwendet werden.

Diese Konvertierungen (Vorzeichenerweiterung) können teuer sein.

%Vor%

Wenn Sie Geschwindigkeit brauchen, ist int eine sichere Wette oder verwenden Sie int_fast8_t (noch sicherer). Wenn die genaue Größe wichtig ist, verwenden Sie int8_t (falls verfügbar).

    
user694733 04.02.2015, 09:20
quelle
0

Wenn Sie über die Code-Leistung sprechen, müssen Sie einige Dinge berücksichtigen, die dies beeinflussen:

  • CPU-Architektur, mehr auf den Punkt, welche Datentypen unterstützt die CPU nativ (unterstützt es 8-Bit-Operationen? 16 Bit? 32 Bit? etc ...)
  • Compiler, die Arbeit mit einem bekannten Compiler ist nicht genug, Sie müssen damit vertraut sein: die Art, wie Sie Ihren Code schreiben, beeinflusst den Code, den er generiert
  • Datentypen und Compiler-Intrinsics: Diese werden vom Compiler bei der Codegenerierung immer berücksichtigt. Die Verwendung des richtigen Datentyps (selbst signierte vs unsigned matters) kann sich dramatisch auf die Performance auswirken.

    "Der Versuch, schlauer zu sein als der Compiler, ist immer eine schlechte Idee" - das stimmt nicht wirklich. Denken Sie daran, der Compiler ist geschrieben, um den allgemeinen Fall zu optimieren, und Sie sind an Ihrem speziellen Fall interessiert; es ist immer eine gute Idee zu versuchen und schlauer als der Compiler zu sein.

Ihre Frage ist wirklich zu weit für mich, um eine "auf den Punkt" Antwort zu geben (d. h. was ist besser Leistung weise). Der sicherste Weg ist, den generierten Assembler-Code zu überprüfen. Zählen Sie zumindest die Anzahl der Zyklen, die der Code in beiden Fällen ausführen würde. Aber Sie müssen den Code verstehen, um zu verstehen, wie Sie dem Compiler helfen können.

    
Pandrei 04.02.2015 09:45
quelle

Tags und Links