Algo optimieren
-
Hallo!
Dieser Algorythmus ist Teil meines Programms zur Huffman Compression. Er soll die Code Datei wieder entschlüsseln. Leider ist er irgendwie extrem langsam.
Vielleicht hat ja jemand eine Idee wie man das optimieren könnte??
(inhaltlich vielleicht etwas verwirrend aber vielleicht sieht ja jemand grobe fehler die ich gemacht habe die die Performance runterziehen.."
char zeichen; char zeichen2; int i,j,k; int groesse,lastbyte; //lastbyte ist die länge des letzten bytes in der codedatei int vorletztes; . . . . vorletztes=0; zeichen2=getc(EingabeDatei); while (!feof(EingabeDatei)) { if (vorletztes==0) { zeichen=zeichen2; if (feof(EingabeDatei)) break; else { zeichen2=getc(EingabeDatei); if (feof(EingabeDatei)) vorletztes=1; } } else zeichen=zeichen2; char2bit((unsigned char)zeichen,res); for (i=0;i < ((vorletztes==0)?8:lastbyte);i++) { sprintf(puffer,"%s%c",puffer,res[i]); for (j=0;j<=255;j++) { //zeichenfolge gefunden? if ( (ascii[j].bincode!="") && (!(strcoll(puffer,ascii[j].bincode))) ) { putc((char),AusgabeDatei); for (k=0;k<10;k++) *(puffer+k)=0; break; } } } }
gruß
Freakout
-
Bitte, keine 4 Posts gleichzeitig vom gleichen Thread! Der Server ist jetzt zwar ein bisschen langsam, ist aber kein grund, 4 mal hintereinander auf "Absenden" zu klicken.
-
nt
-
sorry
wollte eigentlich mur einmal senden
-
mmh,
huffmann-codierung? war das die codierung, bei der es auf die häufigkeít des zecihens im text ankommt?
naja, egal .... hab den code nicht nachvollzogen, aber was auffällt:du liest und schreibst jedes zeichen einzeln in die bzw. aus der datei. das geht gepuffert schneller. also entweder manuell blöcke lesen und schreiben oder die streamfunktion nutzen (fopen, fwrite, fread).
-
Bisher hab ich mich mit dem Huffmann Algo noch nicht beschäftigt, kann dir deshalb auch keine Optimierung dazu geben. Aber hier mal ein paar Tipps zum Code:
sprintf(puffer,"%s%c",puffer,res[i]);
Wenn ich das richtig sehe, dann willst du hier ein Zeichen an einen String anhängen. Das geht auch besser. Dazu initialisierst du zu Beginn eine Variable, zB len, mit der Länge des Strings und ersetzt dann den Code durch
puffer[len] = res[i]; ++len; puffer[len] = '\0';
ascii[j].bincode!=""
Das wird nicht wie gewünscht funktionieren, da in C Strings nicht mit dem == und != Operator verglichen werden können. Was du hier im Grunde vergleichst, sind die Adressen. Deshalb wird der Ausdruck immer true ergeben. Wenn es dir einfach nur darum geht, zu prüfen ob der String nicht leer ist, geht das wie folgt
ascii[j].bincode[0] != '\0'
strcoll(puffer,ascii[j].bincode)
Muss denn strcoll unbedingt sein? Oder reicht strcmp nicht auch?
*(puffer+k)=0;
Wieso so eine komplizierte Schreibweise? Schreib doch einfach
puffer[k] = 0;
Und noch ein allgemeiner Tipp. Du arbeitest mit Strings, und die sind im allgemeinen langsamer als normale Arrays. Wenn's also geht, nimm einfache Datenarrays. Dann kannst du zB auch Funktionen wie memcmp anstatt strcmp verwenden, und das sorgt wie gesagt für mehr Performance.