Code Performance Testen



  • Hallo, ich würde gerne herausfinden, welche meiner Funktionen schneller ist.

    Und zwar geht es darum, in einem String (std::string oder char*) zu schauen, ob ein bestimmtes Zeichen vorkommt.
    Dafür habe ich mir ein Macro angelegt, so:

    #define BENCHMARK(x)\
    t0 = clock();\
    VAR = 0;\
    for(int a = 0; a < 2000000; a++) {\
        srand(time(0));\
        for(int i = 0; i < 100; i++) {\
            randStr[i] = char(rand() % 26 + 'A');\
        }\
        if(x) VAR = 1;\
    }\
        cout << #x ": " << clock()-t0 << endl;\
    
        BENCHMARK(true);
        BENCHMARK(randStr.find(char(0xFF)));
        BENCHMARK(find2(randStr, char(0xFF)));
        BENCHMARK(find_StrChr(randStr));
        BENCHMARK(find1(randStr.data(), randStr.length(), char(0xFF)));
        BENCHMARK(find_asm(randStr.data(), randStr.length(), char(0xFF)));
    

    Mein Problem ist, dass mein Compiler (MinGW im Moment) zu viel wegoptimiert, weshalb ich bei jedem Test den String neu erstellen muss 😕 . Trotzdem bekomme ich immernoch inkonsistente Ergebnisse (zwar bleiben die Ergebnisse beim Mehrfachen starten gleich, wenn ich aber Benchmarks wegnehme oder hinzufüge, dann ändert sich auf einmal alles (manche Funktionen sind auf einmal schneller als andere...). Dazu kommt, dass das erstellen des Strings etwa 90% der Zeit benötigt, weshalb das ganze auch noch sehr ineffizient ist 😞
    OS ist Windows.
    Hat jemand eine Idee?
    Ich habe schon drüber nachgedacht, die Compiler Optimierungen komplett rauszunehmen, aber dann würde mein Code ja nicht mehr realitätsnah sein 😶



  • Wie wäre es nach einem zufälligen Buchstaben zu suchen, anstatt den String immer neu zu generieren? Und Makros statt einer Funktion? Ernsthaft? O_o



  • cooky451 schrieb:

    Wie wäre es nach einem zufälligen Buchstaben zu suchen, anstatt den String immer neu zu generieren?

    Gute Idee!

    cooky451 schrieb:

    Und Makros statt einer Funktion? Ernsthaft? O_o

    Naja, ich wollte den String vorher generieren (nicht im Makro), aber von einer Funktion aus hätte ich dann keinen Zugriff gehabt, ohne die Variable mit zu übergeben :X. Außerdem kann ich so das Ergebnis einfacher ausgeben 🙂


Log in to reply