www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik sprintf vs. selber parsen, performance?


Autor: Trax Xavier (trax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Ich schreibe gerade an einem HTTP server für das Nei-IO board basierend 
auf dem "uWebSrv von simon k" und überlege gerade och ich für das 
verarbeiten der html templates ein sprintf verwenden sollte, oder lieber 
die string selber parsen,
ist da sprintf viel resourcen hungriger?

PS:;
sowas ist sicher auch subobtimal:
  strcpy(pBuffer,g_HtmlComboBegin);
  pBuffer+=strlen(pBuffer);
da wäre eine eigene copy funktion die den pointer gleich mit schiftet 
wohl auch deutlich performanter, oder?
sowas wie
int stradd(char* target, const char* source)
{
  int Length = 0;
  while(source[Length] != 0)
  {
    target[Length] = source[Length];
    Length++;
  }
  target+=Length;
  target[0] = 0;
  return Length;
}

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ich printf meist sowieso drin habe, verwende ich dann auch sprintf in 
solchen Fällen. Allerdings nicht für's komplette Template, weil sonst 
die Grösse des Zielpuffers eine hässliche Rolle spielen kann.

Also verwende ich eigene Templates mit einem einfachen Parser, der 
wenn's passt selber auch sprintf verwendet.

Wenn dir das Tempo eines Webservers Sorgen macht, dann bist du bei einem 
8bitter mit zuwenig Speicher für ein wirklich sauberes TCP-Protokoll (*) 
sowieso falsch. Da ist sprintf nicht das Problem.

*: Beispiel: Wenn der Sendepuffer der Wiznet TCP/IP-Controller zuwenig 
Speicher für 2 Frames hat, dann sendet das Teil jeden Frame zweimal 
über's Netz um die Performance zu verbessern(!). Sonst wird's aufgrund 
von Timeouts nämlich viel langsamer. Soviel zum Thema Performance.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du schon solche String-Funktionen baust, dann bau die 
Buffer-Overflows nicht gleich mit ein. Also bau dir welche, die den 
fälligen Range-Check gleich mit enthalten.

Denk dran, dass im Netzpuffer vielleicht nicht genug Platz für den 
kompletten Ersatzstring ist. Wenn du dann mitten in einem solchen String 
neu aufsetzen musst wird's krass. Lieber vorher kontrollieren und ggf 
den alten Frame kürzer raussenden damit die Ersetzung garantiert in 
einem Stück passt.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein stradd bringts nicht, weil 'target += Length' mit einer lokalen 
Kopie arbeitet.
Guck mal:
http://linux.about.com/library/cmd/blcmdl3_stpcpy.htm

Autor: Trax Xavier (trax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die usage ist so gedacht: pBuffer+=stradd(pBuffer,g_CfgHtmlHeader);

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar, aber besser wär's du machst ebendies mitsamt Überlauftest in der 
Funktion. Entweder mit globalen Variablen weil es sowieso nur einen 
Puffer gibt, oder ein Pufferdescriptor als Parameter für die Funktion. 
Erspart dir die Notwendigkeit, das überall in den Aufrufen 
rumzuschleppen.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Sinn hat dann 'target+=Length'?
Und immernoch: http://linux.about.com/library/cmd/blcmdl3_stpcpy.htm

Autor: Trax Xavier (trax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo das kan ich mir sparen und darunter target[Length] = 0 anstadt 
target[0] = 0 machen
stpcpy ist bei meinem WinAVR nicht definiert in string.h
aber strlcpy ist evl das richtige

hängt

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Trax Xavier wrote:
> die usage ist so gedacht: pBuffer+=stradd(pBuffer,g_CfgHtmlHeader);


nicht besonders gut gedacht.
Du machst viel zu viele unnötige Operationen


Usage
    pBuffer = stradd( pBuffer, g_CfgHtmlHeader );

wobei stradd so definiert ist
char* stradd( char* Target, const char* Source )
{
  while( *source )
    *target++ = *source++;
  *target = '\0';

  return target;
}

Wenn du schon optimierst, dann machs richtig :-)

Das noch fehlende Argument für die target Länge musst du noch einbauen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.