Hallo! Ich hab einen Codevergleich zw. gcc 3.4.1 und 4.0.0 gemacht. Hier zuerst der Code aus 3.4.1: void wait (uint16_t zeit) { f6: 9c 01 movw r18, r24 f8: 01 c0 rjmp .+2 ; 0xfc while (zeit > timer2) asm volatile ("nop"); fa: 00 00 nop fc: 80 91 75 01 lds r24, 0x0175 100: 90 91 76 01 lds r25, 0x0176 104: 82 17 cp r24, r18 106: 93 07 cpc r25, r19 108: c0 f3 brcs .-16 ; 0xfa 10a: 08 95 ret 0000010c <init_timers_z>: } Hier mit 4.0.0: void wait (uint16_t zeit) { f4: 9c 01 movw r18, r24 while (zeit > timer2) f6: 80 91 7b 01 lds r24, 0x017B fa: 90 91 7c 01 lds r25, 0x017C fe: 82 17 cp r24, r18 100: 93 07 cpc r25, r19 102: 40 f4 brcc .+16 ; 0x114 asm volatile ("nop"); 104: 00 00 nop 106: 80 91 7b 01 lds r24, 0x017B 10a: 90 91 7c 01 lds r25, 0x017C 10e: 82 17 cp r24, r18 110: 93 07 cpc r25, r19 112: c0 f3 brcs .-16 ; 0x104 114: 08 95 ret 00000116 <init_timers_z>: }
Sorry, zu früh abgeschickt. Der 4.0.0 lädt hier r24 und r25 sinnloserweise 2x. Oder hab ich da was übersehen?
Noch ein Nachtrag: Wenn ich das NOP rausnehme (timer 2 ist volatile uint16_t) siehts wieder besser aus mit 4.0.0: void wait (uint16_t zeit) { f4: 9c 01 movw r18, r24 while (zeit > timer2); f6: 80 91 7b 01 lds r24, 0x017B fa: 90 91 7c 01 lds r25, 0x017C fe: 82 17 cp r24, r18 100: 93 07 cpc r25, r19 102: c8 f3 brcs .-14 ; 0xf6 104: 08 95 ret 00000106 <init_timers_z>: // asm volatile ("nop"); }
Sieht nach Optimierung für Laufzeit statt Codegrösse aus. Schon mal nach einem Schalter dafür gesucht - immerhin hat der gcc davon eine ganze Menge?
Ist beides mit den selben Einstellungen -O2 kompiliert. Der Code mit 4.0 ist nicht nur langsamer sondern auch länger.
void wait (uint16_t zeit) { f4: 9c 01 movw r18, r24 f6: 01 c0 rjmp .+2 ; 0xfa while (zeit > timer2) asm volatile ("nop"); f8: 00 00 nop fa: 80 91 4a 02 lds r24, 0x024A fe: 90 91 4b 02 lds r25, 0x024B 102: 82 17 cp r24, r18 104: 93 07 cpc r25, r19 106: c0 f3 brcs .-16 ; 0xf8 108: 08 95 ret 0000010a <init_timers_z>: } Ok. Mit -Os passts wieder. Allerdings brauch ich -O2 wegen anderer Optimierungen. Aber ich hab mal gezählt: Wenn die Bedingung beim ersten mal nicht zutrifft, ist der 4.0 in 7 Takten durch, mit 3.4.1 mit 8 Takten. Also ist der 4.0 code doch schneller wenn man nur nachzählt. Sorry für den Wirbel...
Hi für was brauchst du denn unbedingt -O2? Ließ am besten mal file:///C:/Programme/Develop/AVRGCC/doc/avr-libc/avr-libc-user-manual/FA Q.html#faq_optflags Matthias
Hi das ist mir jetzt aber mal sehr peinlich. Ich hoffe das Fritz keinen Zugang auf meine Systempartition hat :-) http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_optflags Matthias
Benchmarks lügen doch eh immer! Bei einigen Routinen bringt -O2 bei mir ca. 30% Laufzeitverbesserung (z.B. Software-PWM für 24 Kanäle). Bei einigen kritischen Stellen schau ich mir den Code auch an, und da sieht man deutlich den Unterschied. Wobei ich jedoch meist zw. -O0 und -O2 vergleiche. Die Sachen die ich grad schreib sind z.T. recht zeitkritisch. Und ich will nicht schuld sein, wenn dauernd Schiffe kollidieren oder ungebremst auf die Kaimauer zurasen :-)
Hi -O0 schaltet den optimierer komplett aus. Das sollte man nicht mit eingeschalteter Optimierung (egal welcher) vergleichen. Wie Andreas schon geschrieben hat: Vergleiche -Os mit -O2. Du wirst kaum einen Unterschied erkennen können. Matthias
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.