einfache Code-Optimierungen

(Firma: irgendeine) #4027053
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?
#4027111
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.
Gast #4027345
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.
#4027431
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. ;-)
(Firma: irgendeine) #4027435
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€ 
;)
Persönliche Seite #4027624
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.
#4027867
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.
Gast #4027876
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
#4027884
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."
Moderator Persönliche Seite #4028046
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.
Gast #4030106
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.

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