Forum: Compiler & IDEs einfache Code-Optimierungen


von Michael E. (Firma: irgendeine) (nodalek)


Lesenswert?

Servus,
ich spiele gerade ein wenig mit dem XC16 Compiler (kostenlose Version) 
herum, und merke gerade, das man händisch schon noch sehr viel am C-Code 
optimieren kann, wahrscheinlich weil es die kostenlose Version ist. Denn 
sowas einfaches, wie ein Bit-Toggle, für das es sogar einen 
Maschinenbefehl gibt, wird sehr ineffizient in Assemblercode umgesetzt.

von Microchip vorgesehener Code:
#define red_Led_Toggle()      _LATA1 ^= 1

ergibt:

000456  801624     MOV LATA, W4
000458  D10204     LSR W4, W4
00045A  624261     AND.B W4, #0x1, W4
00045C  A20404     BTG.B W4, #0
00045E  624261     AND.B W4, #0x1, W4
000460  FB8204     ZE W4, W4
000462  620261     AND W4, #0x1, W4
000464  420204     ADD W4, W4, W4
000466  801626     MOV LATA, W6
000468  2FFFD5     MOV #0xFFFD, W5
00046A  630285     AND W6, W5, W5
00046C  720205     IOR W4, W5, W4
00046E  881624     MOV W4, LATA
mit maximaler Optimierung des Compilers auf Ausführgeschwindigkeit sind 
es noch immer 9 Instruktionen.


der von mir abgeänderte Code:
#define red_Led_Toggle()     __builtin_btg(&LATA, 1)

ergibt:

000456  202C44     MOV #0x2C4, W4
000458  A21014     BTG [W4], #1

Der neue C-Code ist zwar nicht mehr so Portabel wie das Original, aber 
dafür wird es ja in eine eigene Datei ausgelagert, wo man die 
Maschinenabhängigkeit reinpackt, bzw. den konkreten Pin beschreibt. Was 
man sowiso immer auf die Hardware anpasst.

Wird sowas bei der teuren Bezahlversion vom Compiler Optimiert?
Was sind weitere typische Dinge, die man selber gut in C Optimieren 
kann?

von (prx) A. K. (prx)


Lesenswert?

Michael M. schrieb:
> Wird sowas bei der teuren Bezahlversion vom Compiler Optimiert?

Mit Sicherheit.

Gibts bei diesem Compiler in der kostenlosen Version keinerlei 
Optimierung? Denn der gezeigte Code macht klar, dass keinerlei 
Optimierung durchgeführt wird.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Kurzer Blick ins Handbuch verrät: -O1 ist auch in der freien Version 
verfügbar. Der Compiler ist eine angepasste Version vom GCC.

von Peter II (Gast)


Lesenswert?

A. K. schrieb:
> Der Compiler ist eine angepasste Version vom GCC.

müsste er dann nicht frei sein? also die Änderung mit veröffentlich 
werden?

von Max H. (hartl192)


Lesenswert?


von (prx) A. K. (prx)


Lesenswert?

Peter II schrieb:
>> Der Compiler ist eine angepasste Version vom GCC.
>
> müsste er dann nicht frei sein? also die Änderung mit veröffentlich
> werden?

Jene Optimierungen, die GCC von sich aus durchführt, stehen als 
Quellcode zur Verfügung.

Ich hatte den Compiler in einer alten Version aus dsPIC30 Zeiten mal 
ausprobiert. Da war der Lizenzcheck in ein separates Programm 
ausgelagert. Auch beim normalen GCC ist das Programm "gcc" nicht 
wirklich der Compiler, sondern ein Compiler-Driver, der seinerseits 
Compiler, Assembler und Linker aufruft.

Eine spezielle Art vom Optimierung, die an deren 8-Bitter erinnert, 
hatte Microchip damals implementiert. Eine, die im GCC sonst nicht drin 
ist. Sowas wie Zusammenfassungen von kurzen Befehlssequenzen in 
Winzig-Unterprogramme, wenn sich diese Sequenzen an mehreren Stellen 
finden. Spart Platz zu Lasten von Zeit. Und diese Optimierung findet 
ebenfalls in einem externen Programm statt, damit sie nicht der 
GNU-Lizenz unterliegt.

Dass sich das wahrscheinlich ohne übermässig grossem Aufwand zumindest 
zurecht biegen lässt, dass die üblichen GCC Optimierungen inklusive -O2 
und -O3 voll zur Verfügung stehen, halte ich für wahrscheinlich. Aber 
auch -O1 sollte schon völlig ausreichen.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Michael M. schrieb:
> Was sind weitere typische Dinge, die man selber gut in C Optimieren
> kann?

Bei einem ordentlichen Compiler: so gut wie gar nichts.

“Never try optimizing before you have profiled it.”

von Mark B. (markbrandis)


Lesenswert?

Michael M. schrieb:
> Was sind weitere typische Dinge, die man selber gut in C Optimieren
> kann?

Vernünftige Algorithmen und Datenstrukturen wählen hilft. Der Versuch, 
schlauer zu sein als der Compiler, geht meistens schief.

: Bearbeitet durch User
von horst (Gast)


Lesenswert?

Was beim gcc hilft (zwecks Codegröße), sind z.B. temporäre Kopien 
lokaler static-Variablen. Was man ändert, muss man später natürlich 
zurück sichern. Aber so holt man eigentlich immer ein paar Bytes raus. 
Zumindest zeigt es, dass der gcc nicht allwissend und allmächtig ist.

von Mark B. (markbrandis)


Lesenswert?

horst schrieb:
> Was beim gcc hilft (zwecks Codegröße), sind z.B. temporäre Kopien
> lokaler static-Variablen. Was man ändert, muss man später natürlich
> zurück sichern. Aber so holt man eigentlich immer ein paar Bytes raus.
> Zumindest zeigt es, dass der gcc nicht allwissend und allmächtig ist.

Es gilt aber auch: Für nicht genutzten Speicherplatz bekommt man kein 
Geld zurück. ;-)

von Michael E. (Firma: irgendeine) (nodalek)


Lesenswert?

Also mit -O1
kommt das raus:

00031C  2FFFD7     MOV #0xFFFD, W7
000360  D502C4     LSR LATA, WREG
000362  EA8200     COM W0, W4
000364  620261     AND W4, #0x1, W4
000366  420204     ADD W4, W4, W4
000368  801620     MOV LATA, W0
00036A  638300     AND W7, W0, W6
00036C  720306     IOR W4, W6, W6
00036E  881626     MOV W6, LATA

und bei höherer Optimierung gibt es diese Warnung:

Options have been disabled due to restricted license
Visit http://www.microchip.com/ to purchase a new key.


Natürlich kommt das Argument, das man nicht selbs Optimieren soll, weil 
das der Compiler macht. Aber wenn ich durch einige kleine händische 
Optimierungen schon so viel erreichen kann, spar ich mir die über 850€ 
;)

von bla (Gast)


Lesenswert?

Wer zu viel Platz hat, darf natürlich jederzeit -O0 verwenden.

von (prx) A. K. (prx)


Lesenswert?

Michael M. schrieb:
> Also mit -O1
> kommt das raus:

Ist das LATA1 ein Bitfeld? Probiers mal direkt auf dem Register. Der 
Code sieht schwer nach hässliche Nebeneffekten der Bitfeld-Definition 
aus.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Peter II schrieb:
> A. K. schrieb:
>> Der Compiler ist eine angepasste Version vom GCC.
>
> müsste er dann nicht frei sein?

Ja, ist er.  Bedeutet kontret: Wenn du von irgendeinem Autor A die 
Binaries des Compiler bekommen hast — aus legalem Weg natürlich — dann 
muss dir A auch die passenden Quellen zur Verfügung stellen; und zwar in 
einem "allgemein üblichen, maschinenlesbaren" Format und maximal zum 
Selbstkostenpreis (z.B. für CD + Versand).

Nur dadurch, dass A den Compiler geändert hat, hast du noch kein Recht 
darauf, die Quellen zu bekommen.

> also die Änderung mit veröffentlich werden?

Ja, siehe obige Bedingungen.  Diese Änderung kann z.B. darin bestehen, 
'zig Optimierungs-Passes oder nicht unbedingt nötige Pattern aus dem 
Compiler zu entfernen.  Da das Binary dann aus Quellen erzeugt ist, die 
das Zeug nicht enthalten, muss A das entfernte Zeug auch nicht zur 
Verfügung stellen.  In diesem Fall muss A nicht nur mindestens 2 
Generierungsvarianten vorhalten, sondern auch mehrere Quellvarianten.

Falls A einen Lizenz-Manager eingebaut hat, dann muss dieser ebenfalls 
unter GPL stehen falls er (dynamisch oder statisch) gegen GCC gelinkt 
ist.

Weitere Möglichkeit ist, aus gcc (xgcc, cc1, cc1plus, cpp, as, ld oder 
von wo auch immer) ein externes, von GCC unabhängiges Tool zum 
Lizenz-Check zu verwenden. In diesem Fall wird das Tool per exec et al. 
aufgerufen, und die Quellen sollten sich leicht von dem Manager 
bereinigen lassen.

von Rolf M. (rmagnus)


Lesenswert?

Johann L. schrieb:
> Peter II schrieb:
>> A. K. schrieb:
>>> Der Compiler ist eine angepasste Version vom GCC.
>>
>> müsste er dann nicht frei sein?
>
> Ja, ist er.  Bedeutet kontret: Wenn du von irgendeinem Autor A die
> Binaries des Compiler bekommen hast —

Das muss kein Autor sein, sondern ein beliebiger Benutzer. Jeder, der 
ein Programm unter GPL bekommen hat, darf es weiter verbreiten (gegen 
Geld oder auch kostenlos), solange er ebenfalls die GPL einhält.

von Peter II (Gast)


Lesenswert?

Johann L. schrieb:
>> A. K. schrieb:
>>> Der Compiler ist eine angepasste Version vom GCC.
>>
>> müsste er dann nicht frei sein?
>
> Ja, ist er.  Bedeutet kontret: Wenn du von irgendeinem Autor A die
> Binaries des Compiler bekommen hast — aus legalem Weg natürlich — dann
> muss dir A auch die passenden Quellen zur Verfügung stellen; und zwar in
> einem "allgemein üblichen, maschinenlesbaren" Format und maximal zum
> Selbstkostenpreis (z.B. für CD + Versand).
>
> Nur dadurch, dass A den Compiler geändert hat, hast du noch kein Recht
> darauf, die Quellen zu bekommen.

Ich würde das anders lesen:
"nur bei Vertrieb oder Weitergabe müssen der Quellcode und etwaige 
Code-Änderungen den Endnutzern zugänglich gemacht werden"

sobald es vertrieben wird, egal an wen haben sie die quellen zu 
veröffentlichen.

Bei Mikrochip steht nicht von GPL oder GCC, ich glaube mehr das aktuell 
nichts (mehr) mit dem GCC zu tun hat.
http://www.microchip.com/DevelopmentTools/ProductDetails.aspx?PartNO=MPLAB%20XC%20Site%20License

von Rolf M. (rmagnus)


Lesenswert?

Peter II schrieb:
> Ich würde das anders lesen:
> "nur bei Vertrieb oder Weitergabe müssen der Quellcode und etwaige
> Code-Änderungen den Endnutzern zugänglich gemacht werden"

Was ist daran "anders"? Das ist doch eigentlich genau das, was da oben 
steht.

> sobald es vertrieben wird, egal an wen haben sie die quellen zu
> veröffentlichen.

Die Quellen müssen nicht allgemein veröffentlicht werden. Es reicht, 
wenn man demjenigen, dem man die Binaries gegeben hat, auf Nachfrage 
auch die Quellen zur Verfügung stellt.

Peter II schrieb:
> Bei Mikrochip steht nicht von GPL oder GCC,

Naja, also das XC16-Handbuch startet mit den Worten:

"This document describes how to use GNU language tools to write code for 
16-bit applications."

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Peter II schrieb:
> sobald es vertrieben wird, egal an wen haben sie die quellen zu
> veröffentlichen.

Ja, und?  Das tun sie doch, man muss sie sich nur runterladen.

Sogar ein Buildscript ist dabei.  Ist um Größenordnungen freundlicher
als ein kommerzieller ARM-GCC, den ich mir vor einiger Zeit mal
angesehen habe: der basierte offensichtlich auf einem SVN-Snapshot
des GCC-Trees (wobei sie die SVN-Revision, auf der sie aufgesetzt
haben, natürlich nicht erwähnt haben), und man bekam von ihnen
lediglich die Ausgabe von diff -ur gegen diesen Snapshot als Quellen.

von Bonner (Gast)


Lesenswert?

Im Users Guide des Microchip Compilers steht aber auch der Tip drin, 
dass man, um ein Bit zu toggeln, die builtin des Compilers benutzen 
sollte und nicht das xor (_LATA1 ^= 1).

von Michael E. (Firma: irgendeine) (nodalek)


Lesenswert?

Bonner schrieb:
> Im Users Guide des Microchip Compilers steht aber auch der Tip drin,
> dass man, um ein Bit zu toggeln, die builtin des Compilers benutzen
> sollte und nicht das xor (_LATA1 ^= 1).

Und bei den Beispielen und Codeconfigurator, ignorieren sie ihren 
eigenen Tipp ;)

von Bonner (Gast)


Lesenswert?

Die haben den Ueser Guide wohl selbst nicht gelesen. So ist das halt 
wenn die Projekte zu groß werden. Da kann nicht jeder alles wissen. Aber 
ich finds auch ziemlich saumäßig überhaupt schon so was als Tip mit 
geben zu müssen.

von Toxic (Gast)


Angehängte Dateien:

Lesenswert?

Die Informationen in der pdf-Datei sind auf den alten C18-Compiler 
bezogen.Aber es sind auch C-Infos darunter die generell von Interesse 
sein koennten und wenn nicht:die Datei ist schnell wieder geloescht....

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
Noch kein Account? Hier anmelden.