CPU Cycles printf bzw sprintf

Gast #3726167
Lesenswert?

Hallo,

ich habe eine Frage zu der Laufzeit der Funktionen "printf" bzw. 
"sprintf".
Es ist ja bekannt, dass diese Funktionen sehr viele Taktzyklen benötigen 
können.

Weiß zufällig jemand, wieviele Taktzyklen die Ausgabe von einem 16-Bit 
unsigned Wert unter der Verwendung des C166 Compilers von Keil benötigt?

Wenn jemand Werte von einem anderen Compiler hat, würde mich das genauso 
interessieren.

Grüße

Maax
Gast #3726186
Lesenswert?

Danke, genau das wollte ich wissen.
Da ich aktuell kein Board zur Verfügung habe, hätte ich gefragt.
Öfters sollten Sachen schnell gehen, damit man sich auf das Wesentliche 
konzentrieren kann - und es hätte ja sein können, dass sich schon jemand 
zu diesem Thema Gedanken gemacht hat.
Gast #3726213
Lesenswert?

Das mit der menschenlesbaren Ausgabe ist richtig. Es ist nur so, dass 
ein Stück Code zyklisch mit hoher Geschwindigkeit durchlaufen wird (ca. 
500 us), und im Fehlerfall soll eine Logausgabe erfolgen - sowas tritt 
von der Häufigkeit her alle paar Millionen Durchläufe auf. Und das 
printf soll dieses betreffende Stück Code nicht soweit aufblasen dass es 
nicht mehr in der geforderten Zeit (< 500 us) abgearbeitet werden kann.
#3726221
Lesenswert?

Maax schrieb:
> Das mit der menschenlesbaren Ausgabe ist richtig. Es ist nur so, dass
> ein Stück Code zyklisch mit hoher Geschwindigkeit durchlaufen wird (ca.
> 500 us), und im Fehlerfall soll eine Logausgabe erfolgen - sowas tritt
> von der Häufigkeit her alle paar Millionen Durchläufe auf. Und das
> printf soll dieses betreffende Stück Code nicht soweit aufblasen dass es
> nicht mehr in der geforderten Zeit (< 500 us) abgearbeitet werden kann.

Das sollte man anders lösen. Dann solte die Ausgabe einfach nicht in 
diesen kritischen Codeteil. Ein Fehlerflag setzen und Ausgabe in einem 
nicht kritischen Teil machen.
Gast #3726231
Lesenswert?

Wenn ich sicherstelle, dass die Abarbeitung dieses Codeteils im Worst 
Case schnell genug ist, dann spricht meiner Meinung nach nichts dagegen. 
Deshalb mache ich mir Gedanken zur Laufzeit. Es kann theoretisch auch 
passieren, dass mehrere Logausgaben direkt hintereinander folgen. Dann 
wird es mit Flags setzen schon wieder komplizierter. Das einzige was so 
theoretisch passieren kann, ist dass der Puffer von der Uart überläuft 
wo die putchar reinschreibt.
#3726250
Lesenswert?

Max H. schrieb:
> Wenn du nur eine 16bit unsigned int in einen String umwandeln willst,
> wird es wahrscheinlich schneller gehen wenn du eine Funktion schreibst
> die dafür optimiert ist und nicht eine eierlegende Wollmilchsau wie
> sprintf verwendest.

itoa gibts ja schon. Die sollte schnell genug sein.

> Wenn ich sicherstelle, dass die Abarbeitung dieses Codeteils im Worst
> Case schnell genug ist, dann spricht meiner Meinung nach nichts dagegen.
Ist halt unschön.
Moderator Persönliche Seite #3726341
Lesenswert?

m.n. schrieb:
> Die 16 Bit Division soll 20 Takte brauchen

Kann ich mir in dieser Allgemeinheit für einen Prozessor ohne
Hardware-Division nicht vorstellen.

Wiederum: wenn dem so ist, dann wird auch printf keine Größenordnung
langsamer sein.  Das Parsen des Formatstrings kostet, solange keine
Formatierungsanweisungen drin sind, nun auch keine Unmengen an Zeit.
Gast #3726358
Lesenswert?

Jörg Wunsch schrieb:
> Kann ich mir in dieser Allgemeinheit für einen Prozessor ohne
> Hardware-Division nicht vorstellen.

Ich ja eigentlich auch nicht, aber da der C166 einen Hardware-Divider 
auf dem Chip hat, schon :-)
Die 20 Takte gelten übrigens für 32/16 Division, bei der der eingebaute 
Barrelshifter wohl auch seinen Teil dazu beiträgt.
#3726378
Lesenswert?

Wenns ganz knapp wird, und nur seltene log Ausgaben sind, könnte man 
auch den Aufwand an den Leser / Interpreter abschieben und sein eigenes 
utoa mit fixer Base 16 schreiben.

Das wäre dann pro Stelle ca. 1 Und, 4 Shifts nach rechts und eine 
Addition. Und das Ergebnis ist immer noch recht lesbar.

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