Float in datei schreiben
-
Hallo,
ich habe ein Performenzproblem beim Schreiben von Werten in eine Datei.
Schreibe ich nur String in eine Datei ist diese quasi sofort fertig mit dem folgenden Code:
now = time (0); strftime (buff, 100, "%Y-%m-%d %H:%M:%S.000", localtime (&now)); printf ("END.PROCESSING.DATA: %s\n", buff); //output file FILE *fileout; fileout = fopen("out.txt","w"); float p; for(i=0; i<17000;i++){ for(j=0; j<i;j++){ for(z=0;z<400;z++){ //DO SOME WORK } p = 1.0; fputs(allsubsts[i],fileout); fputs(";",fileout); fputs(allsubsts[j],fileout); fputs(";",fileout); //fprintf(fileout, "%f", p); fputs("TEST",fileout); fputs(";\n",fileout); } } fclose(fileout); now = time(0); strftime(buff,100,"%Y-%m-%d %H:%M:%S.000", localtime(&now)); printf("END.CALC.IN.FILE: %s\n",buff);
Wenn ich aber anstatt des Strings "TEST" den float Wert schreiben will dauert das viel länger. Hier die Ausgaben:
// Mit dem float Wert
END.PROCESSING.DATA: 2013-04-26 08:10:33.000
END.CALC.IN.FILE: 2013-04-26 08:11:13.000// Mit dem TEST String
END.PROCESSING.DATA: 2013-04-26 08:14:10.000
END.CALC.IN.FILE: 2013-04-26 08:14:37.000Kann ich das irgendwie performanter gestalten, sodass ich ungefähr auf die selbe Zeit komme?
Grüße
-
bladepit schrieb:
Kann ich das irgendwie performanter gestalten,
zusammenhängenden speicherblock mit float werten mittels fwrite schreiben.
-
fprintf muss ja erst noch die Umwandlung von einer Fließkommezahl in einen String machen. Zudem werden ja auch mehr Zeichen ausgegeben.
Du kannst mehr Pufferspeicher nehmen. Schau dir mal setvbuf an
-
09s098gr schrieb:
bladepit schrieb:
Kann ich das irgendwie performanter gestalten,
zusammenhängenden speicherblock mit float werten mittels fwrite schreiben.
So wie ich das verstehe geht das dann aber nicht zeilenweise oder? Ich schreibe ja oben jeweils eine Zeile.
DirkB schrieb:
fprintf muss ja erst noch die Umwandlung von einer Fließkommezahl in einen String machen. Zudem werden ja auch mehr Zeichen ausgegeben.
Du kannst mehr Pufferspeicher nehmen. Schau dir mal setvbuf an
Hmm das verstehe ich nicht wirklich. Der Pufferspeicher macht doch die Umwandlung nicht schneller oder?
-
Mit fprintf hast du so ziemlich die optimalste Ausgabemethode. Ich würde mir weniger Gedanken um die Umwandlung machen, eher mehr um anderen Code, um die Performance zu verbessern.
-
Youka schrieb:
Mit fprintf hast du so ziemlich die optimalste Ausgabemethode. Ich würde mir weniger Gedanken um die Umwandlung machen, eher mehr um anderen Code, um die Performance zu verbessern.
Ok und was soll ich da noch verbessern? Was kann ich denn anders machen?
-
was hastn davon, da so viele floats reinzuschreiben.
-
?! schrieb:
was hastn davon, da so viele floats reinzuschreiben.
Das sollte ja nicht dein Problem sein aber ich muss einfach einen Export machen falls du es genau wissen. Das Beispiel von oben ist natürlich angepasst. Mein Export ist eine Art CSV Datei wo die Werte neben anderen Informationen auch drin stehen
-
bladepit schrieb:
Youka schrieb:
Mit fprintf hast du so ziemlich die optimalste Ausgabemethode. Ich würde mir weniger Gedanken um die Umwandlung machen, eher mehr um anderen Code, um die Performance zu verbessern.
Ok und was soll ich da noch verbessern? Was kann ich denn anders machen?
Die Antwort stand doch bereits da!!
09s098gr schrieb:
bladepit schrieb:
Kann ich das irgendwie performanter estalten,
zusammenhängenden speicherblock mit float werten mittels fwrite schreiben.
Man besorgt sich also ein ausreichend grosses Stück Speicher und schreibt es als Block weg und eben nicht einzelne Zeichen oder Werte.
Für eine float to string Umsetzung gibt es keine einfachere Lösung als printf, aber die printf() Funktion ist auch die langsamste Funktion der ANSI-Bibliothek. Man sollte sie möglichst wenig aufrufen. Mehrere %f in einem Aufruf oder ganz vermeiden (statt dessen strcat oder puts()) wären erste Ansätze.
Ob fwrite schneller ist als fputs müsste man ausprobieren - glaube ich aber kaum. Die Anzahl der Aufrufe zum schreiben zu reduzieren wird aber sicher was bringen.
-
fwrite ist aber doch binär.
Das geht ja für meinen Anwendungsfall nicht.
Ich versuche grade so wenig Ausgaben wie möglich zu schreiben aber das ist ja irgendwie nicht sinn der sache.
-
Mit fwrite kannst du ebenfalls Strings ausgeben, ala
char s[100]; strcpy(s,"irgendwas"); ... fwrite(s,strlen(s),1,f);
...
Gegenüberfputs(s,fp);
kannst du aber sicher keinen Geschwindigkeitsvorteil messen.