Datei in eine std::map einlesen und nach Value sortieren



  • Da ich momentan kein Internet bei mir habe und nur in der Uni schreiben kann, kann ich das jetzt leider schlecht demonstrieren. Aber die Grundidee ist, dass der Parser nur zwei Pointer hat (begin, end) und darauf wird dann die Gleichheit verglichen. Das spart jegliche Kopie. (Denn genau genommen muss man bei dieser Testmap ja nur 26 Strings erstellen, und die anderen x-tausend müssen nur verglichen werden.)
    parseFloat etc. rufen nur C Funktionen auf wenn ich mich richtig erinnere, und sind ja auch uninteressant hier. Nur parseString sollte halt ganz wesentlich schneller sein. Die Implementierung ist eigentlich auch denkbar einfach, einfach von !isspace nach isspace lesen.



  • cooky451 schrieb:

    .. die Grundidee ist, dass der Parser nur zwei Pointer hat (begin, end) und darauf wird dann die Gleichheit verglichen. Das spart jegliche Kopie.

    nicht ganz. Da ist mindestens eine Kopie, und die ist 100MByte groß. Und genau das ist das Problem. Um die von Dir anvisierten 0,1s zu schaffen, müsste allein Deine Festplatte eine Lesefrequenz von >1000MB/s haben. Mir ist nicht bekannt, dass es so was gibt. Zumindest nicht als handelsüblicher PC.

    Ich benötige zum Parsen mit meiner Variante 1,6s auf einem schnellen PC mit schneller Festplatte. Nur zum Laden der identischen Datei in den Speicher (egal ob std::string, vector<char> oder char*) benötige ich auf dem selben System ebenfalls 1,6s. D.h. das eigentliche Parsen geht im Lesen unter. Wenn Dein Parser anfängt, ist meiner schon fertig.

    Gruß
    Werner


Anmelden zum Antworten