Jede Optimierung kann nach hinten los gehen.
Ob eine Optimierung wirklich diesen Namen verdient, ist immer auch
abhängig von der Zielarchitektur.
Einfach mal bedenken, daß die Voreinstellungen der aktivierten
Optimierungsstrategien in avr-gcc die gleichen sind wie für 32- und
64-Bit Systeme auch!
Und da AVR nun mal weder Date- noch Codecache hat, keine Pipeline
(zumindest ist die Dauer von Befehlsausführungen unabhängig von deren
Anordnung), Sprünge recht billig sind, manche Arithmetik jedoch
vergleichsweise teuer (zB a << n, a/b, a%b) passt das eben bei weitem
nicht immer. Nur daß der Code reisengroß wird, heisst nicht, daß er
schneller wird ;-)
Es vergrößern sich zum Beispiel Sprungweiten. Während in kompaktem Code
oft ein relativer, Sprung genommen werden kann, muss bei ausladendem
Code die Bedingung umgedreht werden (kostet nix), und über einen
absoluten Sprung gesprungen werden, welcher das eigentliche Sprungziel
adressiert. Das ist langsamer und breiter. Wenn eine aufgerolle Schleife
dann zig solcher Konstrukte enthält (Schleifenbedingung, break, ...),
schiesst sich die Optimierung selbst ins Knie...
Unangenehm ist auch, daß viele Optimierungen die Lebensdauer von
Registern erhöhen (zB loop invariant motion etc). Das macht den Code
theoretisch schneller, aber wenn die Register ausgehen und stattdessen
die Werte zum RAM hin- und hergeschaufelt werden müssen, ist der Code
deutlich größer und merklich langsamer. Der Effekt lässt sich hin und
wieder auch bei Inlining beobachten.
Um Gefühl defür zu bekommen, welche Optimierung geeignet ist, hilft nur
eins: Hin und wieder muss man sich die Compilerausgabe anschauen.
Irgendwann hat man dann raus, was in 90% der Fälle gut taugt. -O3 gehört
für avr-gcc aber sehr wahrscheinlich nicht dazu.
Die einzigen Änderungen, die avr-gcc an den Optionen vornimmt, sind
1 | flag_delete_null_pointer_checks = 0;
|
2 |
|
3 | if (!PARAM_SET_P (PARAM_INLINE_CALL_COST))
|
4 | set_param_value ("inline-call-cost", 5);
|
was dem Effekt entspricht von
1 | -fno-delete-null-pointer-checks --param inline-call-cost=5 ; anstatt 12
|
Johann