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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren