Forum: Compiler & IDEs SDCC 3.6.2 #9667 Benchmarkscores


von Philipp Klaus K. (pkk)


Angehängte Dateien:

Lesenswert?

Seit dem 3.6.0-Release hat sich insbesondere bei der Geschwindigkeit des 
erzeugten Codes für Ganzzahlberechnungen einiges getan.

SDCC3.6.0 lag bei Whetstone-, Dhrystone- und Coremark-Scores weit hinter 
den anderen Compilern (Cosmic, Raisonance, IAR): 
http://colecovision.eu/stm8/compilers.shtml
Die aktuelle Entwicklerversion (3.6.2 #9667) erreicht nun höhere 
Dhrystone- und Coremark-Scores als die anderen Compiler.

Philipp

von Christian J. (Gast)


Lesenswert?

Hallo,

lange nichts mehr mit gemacht, Sommer ist bei mir keine Bastelzeit aber 
im Herbst wieder. Gilt das auch für den Z80?

Und was ist mit der so wichtigen Funktion "dead code" zu eliminieren, 
d.h. unbenutzte Funktionen nicht in das Kompilat zu übernehmen? Man 
benutzt ja oft Source Libs - zb ich die mcurses von Frank M. (ukw) - 
aber davon eben nur einen Teil.

Gruss,
Christian

von Philipp Klaus K. (pkk)


Lesenswert?

Wer schon lange nichts mehr mit SDCC gemacht hast, wird wohl einige 
Verbesserungen vorfinden, unabhängig von der Zielarchitektur.

Zu den Verbesserungen seit 3.6.0: Es gab ein paar Bugfixes für Z80. Die 
besseren Scores in Dhrystone und Coremark wurden durch zweierlei 
erreicht: 1) Zielarchitektur-spezifische Optimierungen, 2) allgemeine 
Optimierungen.

1) Bringt für den Z80 erstmal nichts (aber es wurde etwas Infrastruktur 
geschaffen, die es ermöglicht manche der Verbesserungen später 
entsprechend auch für Z80 umzusetzen).
2) Wirkt auch für den Z80. Allerdings beziehen sich diese Optimierungen 
hauptsächlich auf Multiplikationen.

Philipp

von Christian (Gast)


Lesenswert?

Hallo,

danke! Und was ist mit der Dead Code Eleminierung? Wird ein Aufruferbaum 
während der Kompilierung erstellt?


Gruss,
Christian

von Philipp Klaus K. (pkk)


Lesenswert?

Christian schrieb:
> Hallo,
>
> danke! Und was ist mit der Dead Code Eleminierung? Wird ein Aufruferbaum
> während der Kompilierung erstellt?
>
>
> Gruss,
> Christian

Der Compiler eliminiert nur Dead Code innerhalb von Funktionen. Ganze 
Funktionen werden vom Compiler nicht entfernt.

Allerdings kann der Linker ungenutzte Module aus Bibliotheken weglassen. 
Das wird beispielsweise verwendet, um aus der Standardbibliothek nur die 
benötigten Funktionen in die Binärdateien zu übernehmen. Wenn man also 
eine Bibliothek mit einem Modul pro Funktion hat (d.h. üblicherweise 
eine Quelldatei pro Funktion), werden alle nicht verwendeten Funktionen 
aus der Bibliothek weggelassen.

Philipp

von Christian J. (Gast)


Lesenswert?

Philipp Klaus K. schrieb:
> Der Compiler eliminiert nur Dead Code innerhalb von Funktionen. Ganze
> Funktionen werden vom Compiler nicht entfernt.

Vielleicht denkt ihr da ja mal drüber nach. Die Praxis sieht ja so aus, 
dass kaum jemand mehr Libs verwendet, die er selbst gemacht hat. Ich 
habe es in 25 Jahren nie gemacht. Das liegt alles als Source vor und 
wird jedesmal mit kompiliert. Ich binde immer die gleichen "Libs" ein, 
zb mcurses und die Bedienung der UART und picke mir raus, was ich grad 
brauche. Im Kompilat ist aber alles mit drin und das ist bei 48kb nunmal 
ein Platz Killer.

Ich könnte mir aber vorstellen, dass der Umbau eines 1 Pass Compilers 
auf 2 Pass erheblich ist. Aber ausgehend von main kan man sich ja 
rekursiv durchhangeln was alles aufgerufen wird

Und nochwas: Der Code wird ja immer kleiner, je höher man diese 
bestimmte Zahl in der Command Line setzt (fällt mir grad nicht ein), 
dabei erhöht sich auch die Compilierdauer ganz erheblich, bei mir sind 
es 10 Minuten für rund 15 Sourcen. Glaube 100.000 habe ich da 
eingetragen. Möglich sind auch 500.000 aber das bringt nur noch wenig. 
Gibt es da eine sinnvolle Grenze?

von Philipp Klaus K. (pkk)


Lesenswert?

Christian J. schrieb:
> Und nochwas: Der Code wird ja immer kleiner, je höher man diese
> bestimmte Zahl in der Command Line setzt (fällt mir grad nicht ein),
> dabei erhöht sich auch die Compilierdauer ganz erheblich, bei mir sind
> es 10 Minuten für rund 15 Sourcen. Glaube 100.000 habe ich da
> eingetragen. Möglich sind auch 500.000 aber das bringt nur noch wenig.
> Gibt es da eine sinnvolle Grenze?

Wenn weiteres erhöhen des Parameters von --max-allocs-per-node beweisbar 
nichts mehr bringt, steigt auch die Compilierdauer nicht weiter an. Aber 
bei welchem Wert das ist, hängt von der kompilierten Funktion ab.

Philipp

von Philipp Klaus K. (pkk)


Lesenswert?

Christian J. schrieb:
> Philipp Klaus K. schrieb:
>> Der Compiler eliminiert nur Dead Code innerhalb von Funktionen. Ganze
>> Funktionen werden vom Compiler nicht entfernt.
>
> Vielleicht denkt ihr da ja mal drüber nach. Die Praxis sieht ja so aus,
> dass kaum jemand mehr Libs verwendet, die er selbst gemacht hat. Ich
> habe es in 25 Jahren nie gemacht. Das liegt alles als Source vor und
> wird jedesmal mit kompiliert. Ich binde immer die gleichen "Libs" ein,
> zb mcurses und die Bedienung der UART und picke mir raus, was ich grad
> brauche. Im Kompilat ist aber alles mit drin und das ist bei 48kb nunmal
> ein Platz Killer.
>
> Ich könnte mir aber vorstellen, dass der Umbau eines 1 Pass Compilers
> auf 2 Pass erheblich ist. Aber ausgehend von main kan man sich ja
> rekursiv durchhangeln was alles aufgerufen wird

Deutlich einfacher dürfte sich die Optimierung im Linker imlementieren 
lassen.
Aber SDCC hat halt nicht so viele Entwickler, und die SDCC-Entwickler 
haben halt auch nicht unbegrenzt Zeit.
Bisher sieht es aus, als wird die nächste SDCC-Version hauptsächlich 
Standardkompabilität and die Geschwindigkeit des erzeugten Codes 
verbessern:
http://sdcc.sourceforge.net/mediawiki/index.php/SDCC_3.7.0_Release
(siehe Feature List ganz unten).

Philipp

von Christian J. (Gast)


Lesenswert?

Hallo Philipp,

ich finds schon stark, was ihr da fabriziert, allerdings wende ich den 
SDCC auch nur auf Hobby Niveau an, weil ich gern programmiere. Und 
solange da keine kommerziellen Interessen hinter steht kriegt der eben 
auch keinen Turbo aufgeschnallt :-)

Wird ja bald Winter, dann gehts wieder los mit Z80 und STM32...

Gruss,
Christian

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.