String Benchmarks



  • Hoi,
    was sind denn gute Tests um die Performance von String Implementierungen zu testen?
    Sie sollten schnell & einfach zu implementieren sein und vor allem Strings in allen Größen testen.

    Was würde sich da anbieten? Habe ein paar Ideen, würde mich aber über weitere Anregungen freuen. 🙂

    Mfg,
    Ethon



  • Kannst du bei der Gelegenheit auch "iostream <<" versus "printf(...)" testen?





  • gute Idee schrieb:

    http://stackoverflow.com/questions/2872543/printf-vs-cout-in-c

    alles was ich da gelesen hab, zeugt von großer unwissenheit. viel spaß beim programmieren und mit euerer software, wenn ihr euch aus solchen kommentaren eine meinung bildet 😉



  • Aha, und willst du uns deine Weisheiten mitteilen?



  • gute Idee schrieb:

    Aha, und willst du uns deine Weisheiten mitteilen?

    nein. aber man sollte zumindest wissen, was der compiler aus einem printf("\n"); macht 😃 😉



  • Conclusion: if you want only newlines, use printf; otherwise, cout is almost as fast, or even faster. More details can be found on my blog.



  • ja, und um die 'top' antwort zu zerlegen... wer postet in einem c vs c++ thread schon einen text aus der faq einer der beiden parteien und schließt das mit

    OTOH, printf is significantly faster [see, for example, http://programming-designs.com/2009/02/c-speed-test-part-2-printf-vs-cout/]

    ab, wo doch jeder weiß, dass printf eine der langsamsten funktionen der ganzen stdlib ist. 👎



  • und eig. ist diese diskussion sinnlos, da ein c programmierer kein cout verwendet und ein c++'ler die c stdlib vermeiden sollte. dann können wir uns über die sprache streiten, die man verwenden sollte. aber auch das ist sinnlos, weil jede andere stärken hat.



  • Wer hat euch eigentlich ins Hirn geschissen?



  • Ein guter Benchmark ist einer, der verschiedene Stringfunktionen praxisnah gebraucht, z.B. ein Parser für ein textbasiertes Dateiformat, wo Teilstrings gesucht, zerlegt und wieder zusammengekittet werden.



  • Ja, da hast du wohl recht. Allerdings ist das mir wohl zu aufwendig. Kennst du ein Beispiel für einen kleinen Parser, der ohne großen Bibliothekeneinsatz geschrieben ist? Am besten in C/C++ mit nur stdlib/std::string Einsatz und ohne Template/Stream etc Gedöns.

    Hintergrund bei mir ist dass ich ein perfektes String-Backend für eine Scriptsprache schreiben möchte, und da experimentiere ich mit Stringpools/Small String Optimization mit allen verschiedenen Größen/Copy-on-write etc.
    Dh. der Benchmark wird in der Scriptsprache geschrieben und da kann ich noch keine groß komplexen Operationen durchführen.


  • Mod

    Wenn du eine spezielle Optimierung für die Operationen suchst, die deine kleine Scriptsprache kann, dann mach doch das, was das deine Scriptsprache kann und was ihrem Anwendungszweck entspricht.

    Ansonsten einfacher Vorschlag:
    Eine Klasse, die Streams vom Format

    Schlüssel = Wert
    # Kommentar
    Noch_ein_Schlüssel = anderer_wert
    

    lesen, verwalten und schreiben kann. Das solltest du dir flott selber schreiben können und automatisiert Testdatensätze erzeugen können. Da kommen Suche in Strings, Aufteilen, kleine und nicht so kleine Strings vor. Was hierbei nicht getestet wird, ist vor allem Anhängen und Einfügen, sowie sehr große Strings.



  • Ethon schrieb:

    Ja, da hast du wohl recht. Allerdings ist das mir wohl zu aufwendig. Kennst du ein Beispiel für einen kleinen Parser, der ohne großen Bibliothekeneinsatz geschrieben ist? Am besten in C/C++ mit nur stdlib/std::string Einsatz und ohne Template/Stream etc Gedöns.

    Hintergrund bei mir ist dass ich ein perfektes String-Backend für eine Scriptsprache schreiben möchte, und da experimentiere ich mit Stringpools/Small String Optimization mit allen verschiedenen Größen/Copy-on-write etc.
    Dh. der Benchmark wird in der Scriptsprache geschrieben und da kann ich noch keine groß komplexen Operationen durchführen.

    Es kann vom Prinzip kein perfekte String-Klasse geben. Jede Implementierung hat so seine Vorteile aber auch Nachteile.

    Beispielsweise mach ich den String Referenzgezählt, ist das kopieren billig aber ich handele mir Probleme mit multithreading ein. Ohne Referenzzählung ist das kopieren teuer.

    Short string optimization ist interessant. Aber wie lang ist ein short string? Ein längerer Short string kostet Speicher, ist aber schneller.

    Auch könnte man einen String bauen, der nicht Änderbar ist. Da habe ich weniger Probleme mit multithreading, aber dafür kann ich einen String halt nicht ändern.

    Wie immer in der Welt hat alles halt seinen Preis. Optimierung geht nur mit einem bestimmten Ziel. Es gibt aber bei der String Klasse mehrere Ziele und ich kann nicht alle Ziele gleichzeitig erreichen.

    Außerdem würde ich nicht in C/C++ programmieren, sondern in C oder C++. Man sollte sich schon fest legen.



  • Ich benutze erstmal fbstring (Facebook Bibliothek folly), der kombiniert Small-String-Optimization für Strings <= 23 Zeichen, Referenzzählung für Strings >= 256 Zeichen und normales Kopieren bei Strings dazwischen.
    Ich denke dass das eine recht optimale Lösung ist, da spare ich mir erstmal die Benchmarks.

    Außerdem würde ich nicht in C/C++ programmieren, sondern in C oder C++. Man sollte sich schon fest legen.

    Mir ist es egal, welchen Code ich da in Scriptsprachensyntax übersetze. Von mir aus darfs auch Python sein ...

    @SeppJ: Jop, habe bereits angefangen einen Parser für .ini Dateien zu schreiben, wohl das einfachste. 😉


Log in to reply