Bringt dieser Code einen Geschwindigkeitsvorteil?



  • Hallo,

    ich wollte mal folgendes Fragen, wurde im PrettyOs-Forum schon angesprochen.

    Hier mal die Pretty-OS-Implementation von strlen:

    // Lösung der PrettyOs-Stdlib
    // Source: /Source/user/stdlibc/string.c , line 94 - 100
    size_t strlen(const char* str)
    {
        size_t retval = 0;
        for (; *str != '\0'; ++str)
            ++retval;
        return retval;
    }
    

    und hier meine:

    // ich würde das ganze so lösen:
    size_t strlen(const char *str) {
        size_t retval=0;
        while(*(str++)) retval++;
        return retval;
    }
    

    bringt mein code einen geschwindigkeitsvorteil?



  • Das ist doch im Ergebnis dasselbe.



  • Swordfish schrieb:

    Das ist doch im Ergebnis dasselbe.

    ja, es geht aber nicht um das ergebniss, sondern um den weg.

    viele wege führen nach rom. ich kann auch den umweg über china nehmen, aber im ergebnis dasselbe.

    wie gesagt, es geht um die geschwindigkeit.



  • "Ergebnis" meint Kompilat.



  • Da hilft nur benchmarken, oder den Assembler-Code lesen, den der Compiler generiert (-save-temps mit gcc). Wahrscheinlich macht der in beiden Fällen das gleiche daraus.

    Du solltest dir übrigens mal den strlen-Code in der glibc ankucken, die ziehen da ziemlich fiese Magie, um das maschinenwortweise abhandeln zu können (machen dabei die Annahme, dass eine Speicherseite nicht mitten im Maschinenwort endet). Und auf neueren Maschinen will man da im Zweifel sowieso SSE.



  • gibt es eine möglichkeit, den "time" befehl unter linux noch genauer werden zu lassen?

    time zeigt nur 3 stellen nach dem komma. geht da mehr?


  • Mod

    time command schrieb:

    time zeigt nur 3 stellen nach dem komma. geht da mehr?

    Miss einfach mehr Iterationen. Wenn du so kleine Unterschiede hast, dass drei zählende Stellen nicht zum Vergleich reichen, dann bedeutet das, du hast keine Unterschiede.

    Wie dir schon gesagt wurde, sollten beide Varianten das gleiche Compilat liefern. Selbst ganz ohne Optimierung, denn wo bitte besteht da ein Unterschied? Du schreibst die for-Schleife bloß als while-Schleife, das ändert doch überhaupt gar nichts (außer dass ich deine Variante schlechter lesbar finde).

    Wenn du strlen optimieren möchtest, dann kann man das über Bithacks machen. Die machen dann nämlich wirklich etwas anders. Dadurch büßt man aber in gewissen Maßen plattformunabhängigkeit und/oder universelle Einsetzbarkeit ein, da man gewisse Annahmen* machen muss, die beim naiven Code nicht gemacht werden brauchen. Ich kenne den Anspruch von PrettyOS nicht, aber ich spekuliere mal, dass dies nicht gewünscht ist, denn sonst wäre es schon längst geschehen.

    *: Keine sehr unrealistischen Annahmen. Ich wette, die glibc implementiert solche Hacks. seldons Beitrag bestätigt dies.



  • Was genau meinst du mit Iterationen? Und wie mess ich die?



  • Wiederholung.

    size_t strlen(const char * str) {
        size_t retval = 0;
        while( *( str++ ) ) // for( ; *( str++ ); )
            ++retval;
        return retval;
    }
    

    Finde den Unterschied ... 🙄



  • Swordfish schrieb:

    Wiederholung.

    size_t strlen(const char * str) {
        size_t retval = 0;
        while( *( str++ ) ) // for( ; *( str++ ); )
            ++retval;
        return retval;
    }
    

    Finde den Unterschied ... 🙄

    weil ich for schleifen unprofessionell finde. das ganze wirkt dann immer gleich so "anfängerhaft" hingefrickelt.

    man sollte sie nur dann einsetzen, wenn man sich braucht. und das ist hier nicht der fall.



  • Bist du der Typ aus http://www.c-plusplus.net/forum/252326-90 ?



  • ja. warum ist das wichtig?



  • lol. Fang: ><(((º>



  • Swordfish schrieb:

    lol. Fang: ><(((º>

    es geht ja nicht nur um das strlen.

    es geht darum, dass die ganze PrettyOS-stdlib aussieht, als hätte sie ein anfänger programmiert.

    außerdem will man mir nicht glauben, dass man pointer mit NULL und nicht mit 0 prüfen soll, weil "das ja in c++ auch geht".
    außerdem will man NULL überhaupt nicht implementieren, obwohl das in 10 sekunden passiert ist.

    desweiteren setzt man bei PrettyOS auf C99.

    ich finde man muss zu seinen überzeugungen stehen.
    C99 ist einfach, objektiv betrachtet, ein riesiger haufen Scheiße.



  • iterationen? schrieb:

    weil ich for schleifen unprofessionell finde. das ganze wirkt dann immer gleich so "anfängerhaft" hingefrickelt.

    Der 1. April ist drei Tage her.



  • riesiger haufen Scheiße

    Den findet man an den unterschiedlischsten Stellen, beispielsweise in der Hose, manchmal im Kopf und vor allem in Forenbeitraegen.


  • Mod

    Ich sehe schon, du möchtest nichts lernen, sondern nur motzen.


Anmelden zum Antworten