2012-04-10 5 views
0

Ich habe eine Datei (10-20 MB) mit Daten, wobei jede Zeile ein einziges Stück Daten ist.Lesen von Daten aus Dateisystem vs Kompilieren der Daten direkt in Programm

Ich habe ein C-Programm, das liest die Datei aus dem Dateisystem, und dann auf der Kommandozeile Eingang liest es jede Zeile der Datei, eine Berechnung für jede Zeile, um festzustellen, ob diese Zeile zurückgegeben werden soll, und dann eine Teilmenge der Daten zurückgeben.

Nehmen Sie an, dass das Programm einen fread ausführt und die gesamte Datei am Anfang in den Speicher liest und dann direkt aus dem Speicher analysiert.

Würde das Programm schneller ausgeführt, wenn ich, anstatt es aus dem Dateisystem zu lesen, die Daten direkt in das Programm kompiliert habe, indem ich ein Array wie das folgende erstellt habe?

char *dataArray[] = {"data1", "data2", "data3"....}; 

Da das O benötigt die gesamte binäre aus dem Dateisystem, mein Bauchgefühl ist, dass die Ausführungszeit beiden Techniken wären ähnlich, das Bit hohe Ordnung aus dem Dateisystem, da das Lesen wäre zu lesen. Aber hätte jemand mehr definitive Ideen dazu?

+1

Ja, es wäre wahrscheinlich ein wenig schneller kompiliert in. – Ryan

+1

Die andere Sache zu prüfen ist, ob jemand diese Datendatei aktualisieren muss oder nicht (und wie schlecht das Programm brechen kann, wenn die Datei fehlerhaft ist oder fehlt) . – Thilo

Antwort

3

Alles als ein Programmliteral zu definieren wird sicherlich schneller sein.

Sie benötigen den relativ langsamen "offenen" Aufruf für die Datendatei nicht, und Sie müssen die Daten nicht aus dem Puffer in Ihren Speicher verschieben.

Dies war eine allgemeine Optimierung um. 1970, und jede Programmierung/Kodierung Stil Buch seither empfiehlt dringend Sie tun dies nicht. Die tatsächliche Leistungssteigerung ist minimal und was Sie an Leistung gewinnen, verlieren Sie in Wartbarkeit und Flexibilität.

Wenn Sie eine schnelle, wartbare Optimierung für diese Art von Problem wünschen, dann sehen Sie sich den "mmap" Aufruf an, der den Puffer direkt für Ihr Programm verfügbar macht und die Datenbewegung minimiert.

+0

Ich war mit Ihrer Antwort bis zum letzten Absatz nicht einverstanden, aber natürlich haben Sie recht, dass "mmap" eine sehr gute Alternative sein kann. –

1

Ich bezweifle, dass der Unterschied in der Ausführungszeit signifikant sein wird, aber aus Sicht der Speicherauslastung wird es ein großer Unterschied sein, die Daten in die ausführbare Datei zu schreiben (und sie const entsprechend zu qualifizieren). Wenn Sie in Ihrem Programm 10-20 MB Daten aus einer Datei in den zugewiesenen Speicher (z. B. über malloc) lesen, befinden sich die Daten zunächst an zwei Stellen im Speicher: dem Dateisystemcache und dem privaten Speicher Ihres Programms. Die vorherige Kopie kann verworfen werden, wenn der Speicher knapp ist, aber die letztere Kopie belegt physischen Speicher oder wechselt permanent, bis sie freigegeben ist.

Wenn andererseits die 10-20 MB Daten Teil des Bilds Ihres Programms (in der ausführbaren Datei) sind, werden die Daten nach Bedarf ausgelagert und können bei Bedarf verworfen werden, da das Betriebssystem weiß, dass es neu laden kann die Seiten, wenn sie sie wieder benötigt.