Addition oder OR

OP #2683903
Lesenswert?
• ▲
▼
Hallo zusammen,

es gibt ja Situationen, bei denen die Operationen + bzw. | das gleiche 
bewirken. Ein Beispiel wäre:

int tmp;
int array[2];

tmp = (array[0] & 0x00ff) + ((array[1] << 8) & 0xff00);
tmp = (array[0] & 0x00ff) | ((array[1] << 8) & 0xff00);

Ist es richtig, dass das "verodern" die schnellere Variante ist?

Viele Grüße
Gast #2688499
Lesenswert?
• ▲
▼
Ganz grundsätzlich und überhaupt gilt auch hier:

"don't optimize something that is not the problem"

WENN diese einzelne Zeile absolut zeitkritisch ist UND das auch durch 
seriöses Profiling im Einzelfall nachgewiesen wurde, UND man gewillt 
ist, das auch sorgfältig und nachvollziehbar zu dokumenieren, DANN kann 
man über solche Tricks nachdenken.

Ansonsten sollte man les- und wartbarkeit grundsätzlich bevorzugen. Wenn 
also zwei Integerwerte zu addieren sind, schreibt man "+", wenn zwei 
Bitmasken zu ver-odern sind, emtsprehcend "|". Ob beides im Einzelfall 
zum gleichen Ergebnis führt, ist egal.

Oliver
Moderator #2688570
Lesenswert?
• ▲
▼
Peter Dannegger schrieb:
> Beim AVR-GCC ist mir aufgefallen, daß er OR nicht mag. Er erzeugt dann
> fast immer schlechteren Code.

Bei neueren Compiler-Versionen ist es in Beispielen wie dem oben
genannten eher andersherum.

Deswegen bringt es tatsächlich nicht viel, an solchen Stellen optimieren
zu wollen. Für mich ist die Oder-Variante die logisch etwas sinnvollere.
Außerdem kann man bei ihr auf die vielen hässlichen Klammern verzichten.
#2688964
Lesenswert?
• ▲
▼
A. K. schrieb:
> Er sagt damit ja nur, dass manche Anwender die Prioritäten nicht im Kopf
> haben und man denen zuliebe Klammern setzen sollte.

Seit wann sehen Anwender einer Software den Sourcecode? (mit Ausnahme 
der Ausnahmen)

Gute Programmierer setzen gerade so viele Klammern, wie eben nötig sind, 
damit der Compiler keine Warnungen ausgibt.

Und wer Klammern hässlich findet, der hat noch nie LISP programmiert - 
oder schon zu oft ;-)
OP #2689167
Lesenswert?
• ▲
▼
Grundsätzlich bin ich auch für lesbareren Code (und um Klarheit zu 
schaffen auch eher mehr Klammern als unbedingt nötig).
Von daher stimme ich zu, dass Integerwerte per "+" zu addieren sind und 
Bitmasken per "|" zu ver-odern sind.

Nur hätte es ja sein können, dass man eine grundsätzliche Aussage 
darüber hätte treffen können, was schneller ist. Da das aber so stark 
von Compiler abhängig ist, muss es wenn nötig jeweils im Einzelfall 
entscheiden.
Gast #2689508
Lesenswert?
• ▲
▼
Thomas L. schrieb:
> Nur hätte es ja sein können, dass man eine grundsätzliche Aussage
> darüber hätte treffen können,

Ausser in pathologischen Grenzfällen ist es doch prinzipiell nicht 
sinnvoll, überhaupt über "Optimierungen" auf diesem Level nachzudenken. 
Das führt ausser zu miserablen Code zu gar nichts. In 100% aller Fälle 
spielt ein eventueller Auführunsggeschwindigkeitsunterschied keine 
Rolle. Dazu kommt, daß Compilerbauer nicht dumm sind - manch ein 
Compiler optimiert so etwas.

Wenn es in einer zeitkritischen Routine tatsächlich auf jeden einzlenen 
Prozessorzyklsu ankommt, geht eine Optimierung sowieso nicht ohne Blick 
ins erzeugte Compilat, und dann beantworten sich solche Fragen von 
alleine.

Oliver
Gast #2689518
Lesenswert?
• ▲
▼
Bei einem guten Compiler sollte das doch egal sein, weil er die 
Optimierung selbst vornimmt. Der C-Programmierer sollte es so machen, 
wie es für einen Menschen am besten lesbar ist.

Genauso sollte doch egal sein ob ich
i++;
oder i=i+1;
oder i+=1;
schreibe
In jedem Falle sollte der Compiler ein inc daraus machen, sofern es die 
verwendeten Datentypen zulassen.
Gast #2689582
Lesenswert?
• ▲
▼
Mark Brandis schrieb:

> Gute Programmierer setzen gerade so viele Klammern, wie eben nötig sind,
> damit der Compiler keine Warnungen ausgibt.

Nein, mit sowas bruesten sich nur Programmierer, die sich fuer gut 
halten.

Wirklich gute Programmierer schreiben Code der eindeutig wiedergibt, was 
sie machen wollen - auch wenn man nicht alle Compiler-Regeln auswendig 
weiss. Denn man weiss nie, ob der naechste Programmierer genauso gut ist 
wie man selbst, oder ob man in 5 Jahren noch genauso gut alle Regeln 
parat hat oder, was noch viel wichtiger ist: Ob man wirklich selbst so 
gut ist, wie man glaubt.
#2689604
Lesenswert?
• ▲
▼
Marwin schrieb:
> Wirklich gute Programmierer schreiben Code der eindeutig wiedergibt, was
> sie machen wollen - auch wenn man nicht alle Compiler-Regeln auswendig
> weiss.

Daß OR nachrangig ist, ist doch klar.
Ich programmiere auch CPLDs und da hat noch nie jemand unnütze Klammern 
gesetzt.
Ein CPLD hat eine AND/OR-Matrix, d.h. erst erfolgt die AND-Verknüpfung 
und dann das OR.
Es ist nur üblich, daß die OR-Terme auf die nächste Zeile kommen, da 
deren Anzahl begrenzt ist und man so besser die Auslastung erkennt.
Ein GAL22V10 hat z.B. Macrozellen mit 8 .. 16 OR-Termen.


Peter

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.