Benchmark float/int



  • Du solltest mindestens 2 Modifikationen machen:

    1. Ermittle den Wert von "loops" zur Laufzeit - lies den aus einem Textfile oder sowas. So dass der Compiler den Wert zur Compilezeit eben nicht wissen kann. Das sorgt schonmal dafür dass das Ergebnis der Schleife nicht zur Compilezeit ermittelt werden kenn.

    2. Übergib das Ergebnis einer Funktion die der Compiler nicht kennt bzw. nicht wegoptimieren kann. Dazu eignet sich unter Windows z.B. WriteDebugString oder du kannst den Wert auch einfach mit ausgeben lassen (in das Textfile/den cout Stream/...). Das sorgt dafür dass der Compiler nicht die ganze Berechnung aus der Schleife rausnehmen kann, weil das Ergebnis ja verwendet wird.

    Das Programm so wie es ist würde dir ein wirklich guter Compiler "zu nichts" optimieren 😉
    EDIT: genau das hat der gcc mit -O3 anscheinend gemacht.



  • Hmja, ein Ergebnis von Unendlich spricht wohl schon dafür, dass der ganze Loop wegoptimiert wurde. Ich hatte gehofft dass der Compiler nicht clever genug ist, um zu sehen dass die Berechnungen eigentlich überflüssig sind. Ich werde mal einen Versuch machen, wo die Variable einen zufälligen Anfangswert hat und nicht in jedem Loopdurchlauf neu initialisiert wird und das Resultat dann auch zurück gegeben wird. Mal sehen. Danke für eure Antworten. 🕶



  • schaltet doch einfach die Optimierung aus



  • Das macht den Vergleich aber nicht unbedingt deutlich aussagekräftiger. Tests sollten unter möglichst realen Bedingungen laufen. Keine Optimierungen ist imho nicht sehr real 😉



  • TactX schrieb:

    Das macht den Vergleich aber nicht unbedingt deutlich aussagekräftiger. Tests sollten unter möglichst realen Bedingungen laufen. Keine Optimierungen ist imho nicht sehr real 😉

    naja, aber in dem fall will er ja nicht wissen wie toll und schnell sein programm läuft, sondern wie viel zeit die berechnungen verbraten...



  • Aber eben die Berechnungen werden ja auch durch die Optimierung beeinflusst.



  • TactX schrieb:

    Aber eben die Berechnungen werden ja auch durch die Optimierung beeinflusst.

    aber eben deshalb muss man auch dafür sorgen, dass nix optimiert werden kann...



  • Also testen wir Berechnungen unter vollkommen unrealistischen Bedingungen um was rauszufinden? Die Vorteile der CPUs die ja teilweise nur in "realem" Code zum tragen kommen fliessen hier ja nicht ein. Ich sehe den Sinn einfach nicht 😕



  • TactX schrieb:

    Die Vorteile der CPUs die ja teilweise nur in "realem" Code zum tragen kommen fliessen hier ja nicht ein.

    guck doch mal seine 'benchmark' funktion.
    ein aggressiv optimierender compiler compiliert die zu *nichts*
    es gibt da zwar 'realen' sourcecode, aber den kann er auch gleich in /* */ einpacken 😉



  • net schrieb:

    TactX schrieb:

    Die Vorteile der CPUs die ja teilweise nur in "realem" Code zum tragen kommen fliessen hier ja nicht ein.

    guck doch mal seine 'benchmark' funktion.
    ein aggressiv optimierender compiler compiliert die zu *nichts*

    Klar. Ich meine ja nur, dass man sowas eh nur mit einem etwas besseren/realeren Test einigermassen aussagekräftig testen kann. Der Test wird ja nicht wirklich sinnvoller nur weil man das komplette Wegoptimieren unterbindet. Wenn eh nur die einzelnen Laufzeiten der ALU/FPU-Befehle interessieren, kann eh ins Manual schauen. Alle anderen Effekte (Pipelining, Caching, SIMD, whatever) scheinen euch ja nicht zu kehren.


Anmelden zum Antworten