Forum: Mikrocontroller und Digitale Elektronik Fragen zur Programm Optimierung


von Trax X. (trax)


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')

von Gast (Gast)


Lesenswert?

Compilier es doch erstmal und schau das Assembler Listing an.

von Oliver (Gast)


Lesenswert?

>if(*(g_CfgHtmlLine+Trans->j) = '%' && *(g_CfgHtmlLine+Trans->j) = 'P')

enthält gleich zwei Fehler ...
1
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

von Ahem (Gast)


Lesenswert?

@ Trax

Das Problem mit Deinem vorgeschlagenen Code
1
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:
1
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.

von Trax X. (trax)


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
1
#define strncmp_PP(_L,_R,_n)       strncmp_P(_R,_L,_n);
oder
1
#define strncmp_PP(_L,_R,_n)       _str2cmp_P(_L,_R)
2
int _strcmp_P(const prog_char* L,const char* R)
3
{
4
  if(pgm_read_byte(L) == R[0] && pgm_read_byte(L+1) == R[1])
5
    return 0;
6
  else
7
    return 1;
8
}
diesmal ein auszug aus meinem und getestetem funktionierendem code, 
aufruf ist
1
if(strncmp_PP(g_CfgHtmlLine+Trans->j,"%P",2) == 0)

von Karl H. (kbuchegg)


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.

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.