www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fragen zur Programm Optimierung


Autor: Trax Xavier (trax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Worauf mussman achten um das eigene programm so effizient wie möglich zu 
machen?
ich weis das ist ne ziemlich algemeine frage aber trotzden wäre jede 
antwort sehr wilkommen.


PS: was ist besser
if(strncmp_PP(g_CfgHtmlLine+Trans->j,"%P",2) == 0)
oder
if(*(g_CfgHtmlLine+Trans->j) = '%' && *(g_CfgHtmlLine+Trans->j) = 'P')

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Compilier es doch erstmal und schau das Assembler Listing an.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>if(*(g_CfgHtmlLine+Trans->j) = '%' && *(g_CfgHtmlLine+Trans->j) = 'P')

enthält gleich zwei Fehler ...
if(*(g_CfgHtmlLine+Trans->j) == '%' && *(g_CfgHtmlLine+Trans->j) == 'P')

ist viel schneller, da der Compiler erkennen wird, das j nicht 
gleichzeitig % und P sein kann. Also optimiert er die Zeile, und dazu 
gleich noch den ganzen if-Block, weg. Allerdings ist das wohl nicht 
exakt das, was du eigentlich wolltest.

Oliver

Autor: Ahem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Trax

Das Problem mit Deinem vorgeschlagenen Code
if(*(g_CfgHtmlLine+Trans->j) = '%' && *(g_CfgHtmlLine+Trans->j) = 'P')
ist, das er so in keinem Fall funktioniert.
Es fehlt die Indizierung der Elemente des Vektors j und der korrekte 
Operator für einen Vergleich:
if(*(g_CfgHtmlLine+Trans->j) == '%' && *((g_CfgHtmlLine+Trans->j)+1) == 'P')

Danach scheinst Du noch eine Wegstrecke von der Fragestellung "wie 
programmiere ich optimal" entfernt zu sein. Am besten lernst Du 
überhaupt erstmal (in C) programmieren.

Autor: Trax Xavier (trax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann C sogar recht gut, ich habe nur die ganz böse Angewohnheit, 
alles schnell schell zu machen und Sachen zu posten ohne sie zu testen,
Bei genauerer Betrachtung der 2 von mir geposten Zeilen sollte auch 
auffallen das *(g_CfgHtmlLine+Trans->j) nicht funktionieren kann da 
g_CfgHtmlLine eine prog_char array ist den oben benutze ich ja 
strncmp_PP in dem original code benutzte es müsste schon 
pgm_read_byte(g_CfgHtmlLine+Trans->j) sein ;)

also noch mal die frage was ist besser
#define strncmp_PP(_L,_R,_n)       strncmp_P(_R,_L,_n);
oder
#define strncmp_PP(_L,_R,_n)       _str2cmp_P(_L,_R)
int _strcmp_P(const prog_char* L,const char* R)
{
  if(pgm_read_byte(L) == R[0] && pgm_read_byte(L+1) == R[1])
    return 0;
  else
    return 1;
}
diesmal ein auszug aus meinem und getestetem funktionierendem code, 
aufruf ist
if(strncmp_PP(g_CfgHtmlLine+Trans->j,"%P",2) == 0)

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

Bewertung
0 lesenswert
nicht lesenswert
letzten Endes gibt es immer nur eine Möglichkeit deine Frage zu 
beantworten: Probier beide Varianten aus und miss die Laufzeit

Alles andere ist Kaffeesatzleserei.

Allerdings: Mit solchen Low-Level Optimierungen gewinnt man meistens 
nicht die Laufzeit. Algorithmische Optimierungen sind meist viel 
zielführender. Ob eine Anweisung, die 2 mal in der Sekunde ausgeführt 
wird, um 20 Millisekunden schneller wird oder nicht, spiel global 
gesehen so gut wie keine Rolle.

Erste Grundregel der Optimierung: Stelle fest wo deine Rechenzeit 
verbraten wird. Nicht raten, nicht glauben ... sondern messen! Alles 
andere ist sinnlos.

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.