Hash-Funktion für arrays bzw. double-werte



  • Danke schonmal für die Antworten.
    @Life: Wie sähe denn jetzt eine hash_map Implementierung aus wenn ich die Hash_Funktion aus der von Dir gezeigten Boost-Lib verwenden wollte? Ich sehe da nicht so richtig wie ich das Ding einbinde.

    @Nexus: Wie sicher bist Du Dir dass C-Arrays gleich performant sind zu std::arrays? Kannst Du Deine Antwort auch Begründen? (evtl. Tests gemacht?)



  • Testo schrieb:

    @Nexus: Wie sicher bist Du Dir dass C-Arrays gleich performant sind zu std::arrays? Kannst Du Deine Antwort auch Begründen? (evtl. Tests gemacht?)

    Das ist eine Binsenweisheit.



  • Testo schrieb:

    @Life: Wie sähe denn jetzt eine hash_map Implementierung aus wenn ich die Hash_Funktion aus der von Dir gezeigten Boost-Lib verwenden wollte? Ich sehe da nicht so richtig wie ich das Ding einbinde.

    http://www.boost.org/doc/libs/1_47_0/doc/html/hash/tutorial.html

    Das 2. Beispiel sieht für dich passend aus.



  • Das ist eine Binsenweisheit.

    Soll jetzt nicht aggressiv wirken. Ich will nur etwas lernen:
    Nur weil es jeder sagt heißt es nicht dass es stimmt. Wenn alle aus dem fenster springen springe ich nicht unbedingt aus dem fenster.

    Könnte es sein, dass die STL mit ihren containern im worst case nen tick langsamer als C-Arrays ist? Allerdings ist der tick so klein dass es wohl gar nicht ins gewicht fällt?


  • Mod

    Testo schrieb:

    Könnte es sein, dass die STL mit ihren containern im worst case nen tick langsamer als C-Arrays ist? Allerdings ist der tick so klein dass es wohl gar nicht ins gewicht fällt?

    Im Worst-Case dürfen die tatsächlich langsamer sein. Worst-Case ist hier aber kein Anwenungsfall sondern eine Worst-Case Implementierung. Die darf theoretisch nämlich beliebig viel Unsinn machen, sogar Warteschleifen einbauen. Die Container in der Standardbibliothek von MSVC sind so ein Fall wo alle paar Wochen hier jemand mit einem Benchmark auftaucht der beweist, wie viel schneller die C-Methoden doch sind. Dabei haben sie bloß nicht das Handbuch ihres Compilers gelesen, bei dem noch irgendwelche tollen Flags gesetzt werden müssen, damit die Container keine Laufzeitprüfungen machen.
    Ist das jedoch ohne überflüssige Sicherheitsvorkehrungen implementiert, dann ist vector exakt so schnell wie ein dynamisches Array und array exakt so schnell wie ein statisches Array. Ich schreibe exakt, denn das ist es wirklich. vector ist intern ein dynamisches Array, array ist intern ein statisches Array, beide haben bloß ein abstrahiertes Interface und das gibt es in C++ gratis (zumindest wenn man die Compileroptimierungen einschaltet).

    Die anderen Container (list, set, map, ...) haben wiederum ganz andere Eigenschaften und hängen normale Arrays entweder weit ab oder sind viel langsamer, je nachdem was man mit ihnen macht.



  • Testo schrieb:

    Könnte es sein...

    Wenn ich doch nur jemanden kennen würde, der die Zeit und Muße hat, das mal genau zu messen. Starke Fehlereinflüsse sind:

    Anderer Prozess kommt dran. Abhilfe: Oft messen, 1000-mal und den schnellstan Lauf nehmen, nicht wie immer vorgeschlagen den Durchschnitt.

    Nicht -march=native und -O3 haben oder Compiler kennt Deinen Prozessor nicht gut genug und aligned Schleifen, Funktionseintritte oder Variablen nicht gut. Abhilfe: Auch mal mit anderer Funktionsreihenfolge compilieren und mit einer SInnlostätigkeit davor.

    Der Compiler optimiert alles weg. Abhilfe: Es muß was berechnet werden, das alle Schritte miteinbezueht, und das Ergebnis muß am Ende ausgegeben werden.

    Und natürlich fehlerprüfungen von MSVC.

    Damit kann man Testcode auf 5 signifikante Stellen ausmessen. Kein Witz, ich habe regelmäßig 5 stabile Stellen.


Anmelden zum Antworten