Zeit zum auslesen

Hallo,

wie kann ich die Zeit die der Rechner zum auslesen der Datei braucht rausfinden?

mein Prog:

while ((fgets(hilf_i, 10, f_i) != NULL))
{
ungefiltert_i[anzahl_i]=(int)atoi(hilf_i);

help_a_i=z1_i*A_K[1]+z2_i*A_K[2];
z_i=ungefiltert_i[anzahl_i]-help_a_i;
gefiltert_i=(int)(z_i*B_K[0]+z1_i*B_K[1]+z2_i*B_K[2]);
z2_i=z1_i;
z1_i=z_i;

o_dig_filt->gefilterte_W[0].gefilt=gefiltert_i;
printf("%d \n", o_dig_filt->gefilterte_W[0].gefilt);





}

oder wie kann ich das ganze schneller machen???

MFG,
Alexander

Hallo,

wie kann ich die Zeit die der Rechner zum auslesen der Datei
braucht rausfinden?

Fragen:

Wie viele Werte, wie gross ist die
Wertedatei, wieviel Speicher hast
Du zur Verfügung, welcher Rechner
etc.

=> Rahmenbedingungen (möglichst genau)
und: wie „schnell“ ist es jetzt?

Grüße

CMБ

Sdrawstwute Semjon Michailowitsch,

Fragen:

Wie viele Werte, wie gross ist die
Wertedatei, wieviel Speicher hast
Du zur Verfügung, welcher Rechner
etc.

=> Rahmenbedingungen (möglichst genau)
und: wie „schnell“ ist es jetzt?

Es sind ca. 100000 Werte. Dies varrieren zwischen -50 und 8000.
Speicher: 128MB
CPU:100MHz (Industrierechner-MEN)

Momentan brauche ich ca. 1 Stunde bis alle Werte durchgelaufen sind.
Mein Programm: Ich lese die Werte einzehln ein, jeder Wert läuft durch meine Routine durch, wird an eine Struktur übergeben und in eine Datei gespeichert.

MfG,
Alexander

Hallo Alexander,

Es sind ca. 100000 Werte. Dies varrieren zwischen -50 und
8000.
Speicher: 128MB
CPU:100MHz (Industrierechner-MEN)

Momentan brauche ich ca. 1 Stunde bis alle Werte durchgelaufen
sind.

WO macht das printf() seine Ausgabe ??
Bei einem Industrierechner könnte das auch die serielle SChnittstelle sein …

Mein Programm: Ich lese die Werte einzehln ein, jeder Wert
läuft durch meine Routine durch, wird an eine Struktur
übergeben und in eine Datei gespeichert.

WIE schreibst du in die Date?
Jeden Wert einzeln und jedesmal wird die datei geöffnet und geschlossen ??

MfG Peter(TOO)
P.S. Hat dein Industrierechner keine SPC-Taste ???

Hallo Alexander,

  1. Zeit rausfinden: Alle operationen in der Schleife löschen und genauso laufen lassen

  2. was verbraucht die meiste Zeit? Nur jeweils genau eine zusammenhängende Operation in die Schleife, und mehrverbrauch messen.

  3. verbessern: Da Dein Code nicht vollständig ist, können diese Tipps es auch nicht sein

a) zuerst die relevanten Teile rausfinden, und NUR diese verbessern, da ansonsten die Gefahr von neuen Fehlern nicht von Nutzen ist.

b) einlesen in einem Rutsch kann besser sein. Wenn Du z.B. nur wenige MB große Dateien hast, dann solltest Du (wenns geht statisch) dafür Speicher freihalten.

c) printf kann problematisch sein, braucht meist länger als alle anderen Routinen zusammen, da externe Hardware angesprochen werden muss(z.B. Grafikspeicher). Evt. lieber in Speicher und dann in eine Datei schreiben. Darüberhinaus geschieht die Auswertung des formatstrings bei printf / sprintf / fprintf nunmal zur Laufzeit, quasi ein kleiner Interpreter. Der Rechenaufwand bei itoa + strcpy z.B. ist da ungleich kleiner, da von vornherein relativ klar ist, was zu tun ist.

d) wie auch immer A_K und B_K sich verändern, evt. kannst Du durch geschicktes umstellen ein paar Multiplikationen einsparen. Meist wird der Einspareffekt jedoch deutlich überschätzt.

e) Was meistens nichts bringt wäre eine zusammenfassung der Rechen-Operationen in einen Spagethicode, nur um eine Zeile daraus zu machen. Auch das „optimieren“ von Strukturen oder Pointer-Indirektionen / Array-Zugriffen ist meistens unnütz.

Viel Glück

achim

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

WO macht das printf() seine Ausgabe ??
Bei einem Industrierechner könnte das auch die serielle
SChnittstelle sein …

printf ist nur zum Testen da, ich will am Bilschirm sehen, das dr Rechner was macht. Wenn ich printf weg lasse, wird das Programm nicht bedeutend schneller.

Mein Programm: Ich lese die Werte einzehln ein, jeder Wert
läuft durch meine Routine durch, wird an eine Struktur
übergeben und in eine Datei gespeichert.

WIE schreibst du in die Date?
Jeden Wert einzeln und jedesmal wird die datei geöffnet und
geschlossen ??

Unten steht nochmal meine vollständige Funktion.
Ja, beim reinschreiben wird die Datei jedes mal geöffnet und geschlossen.

P.S. Hat dein Industrierechner keine SPC-Taste ???

SPC-Taste??? :frowning:(

MfG,
Alexander

digFilt_fhl einlesen_und_dig_filtern( char* filename_1, char* filename_2, S_dig_filt* o_dig_filt)


…Variablen deklaration

f_i=fopen (filename_1, „r“);

while ((fgets(hilf_i, 7, f_i) != NULL))
{
ungefiltert_i=(int)atoi(hilf_i);

help_a_i=z1_i*A_K[1]+z2_i*A_K[2];
z_i=ungefiltert_i-help_a_i;
gefiltert_i=(int)(z_i*B_K[0]+z1_i*B_K[1]+z2_i*B_K[2]);
z2_i=z1_i;
z1_i=z_i;

o_dig_filt->gefilterte_W[0].gefilt=gefiltert_i;
printf("%d \n", o_dig_filt->gefilterte_W[0].gefilt);

if(help_i == 0)
{
f_i_e=fopen(filename_2, „w“);
fprintf(f_i_e, „%d \n“, gefiltert_i);
fclose(f_i_e);
}
if(help_i == 1)
{
f_i_e=fopen(filename_2, „a“);
fprintf(f_i_e, „%d \n“, gefiltert_i);
fclose(f_i_e);
}
help_i = 1;
}
return (fehler);
}

Hallo Alexander,

(*räusper*)

Ähmm, wie lange arbeitest Du
eigentlich schon mit C?

Mir ist folgendes aufgefallen:

 help\_i = 0;
 f\_i = fopen (filename\_1, "r");
 
 while ((fgets(hilf\_i, 7, f\_i) != NULL)) {
 ...
 if(help\_i == 0) {
 f\_i\_e=fopen(filename\_2, "w");
 ...
 fclose(f\_i\_e);
 }
 if(help\_i == 1) {
 f\_i\_e=fopen(filename\_2, "a");
 ...
 fclose(f\_i\_e);
 }
 help\_i = 1;
 }

Also, bei 100,000 Werten würdest Du
auch 100,000 mal das File öffnen und
schliessen.

Dafür ist Dein Programm doch recht schnell :wink:

Grüße

CMБ

Hallo,

C hatte ich in meinem Studium, nur habe ich leider fast keine Erfahrung mit programmieren. Und jetzt muss ich ein Filter in C implementieren.

Aber danke für den Hinweis! Ich habe mein Programm jetzt geändert und jetzt brauche ich nur ein paar sec. (ca. 30s)

DANKE!!!

Gruss,
Alexander

Hallo Alexander,

WO macht das printf() seine Ausgabe ??
Bei einem Industrierechner könnte das auch die serielle
SChnittstelle sein …

printf ist nur zum Testen da, ich will am Bilschirm sehen, das
dr Rechner was macht. Wenn ich printf weg lasse, wird das
Programm nicht bedeutend schneller.

Das war die eine Möglichkeit. Wenn die Serielle z.B. auf 300 Bps, also 30 Zeichen/s, eingestellt ist würde, wenn der AUsgabebuffer voll ist, dein Programm auch nicht mehr scheller sein können, als doese Daten raus gehen…

WIE schreibst du in die Datei?
Jeden Wert einzeln und jedesmal wird die datei geöffnet und
geschlossen ??

Unten steht nochmal meine vollständige Funktion.
Ja, beim reinschreiben wird die Datei jedes mal geöffnet und
geschlossen.

OK, da war dein Problem:

fopen() muss ja die Datei zuerst auf der Platte im Verzeichnis finden und dann die Informationen über die Datei und deren Lage auf der Platte einlesen. Das brauch seine Zeit.

fclose() schreibt dann alle Daten im buffer auf die Platte und muss noch einiges anderes bereinigen, z.B. die Dateilänge, Zeit/Datum usw. nachtragen.

Zudem trickst du so noch den Schreib-Cache aus, de fakto hast du jeden Wert einzeln in den Sektor geschrieben. Das bedeutet für das Betriebssystem: Sektor lesen, modifizieren und wieder auf die Platte schreiben.
Da kommen schon Sekunden zusammen.

MfG Peter(TOO)