anfängerprobleme mit sprintf



  • Swordfish schrieb:

    Nana, des passt schon. Ich find's halt ned schön.

    In C++ ist schön, was komplex aussieht und dabei den Code verkürzt. 🤡



  • Es is wurscht. Der Compiler macht eh aus beidem des gleiche.



  • Ich hab nochmal was neues probiert.

    std::string to_hex_string(long long val)
    {
        std::string hex;
        const char inv[] = "0123456789abcdef";
        long long copy, size;
        copy = val;
        for(size = 0; copy /= 10; ++size);
        hex.resize(size);
        do
        {
            hex[size-((copy++)+1)] = inv[val%16];
        } while(val /= 16);
        return hex;
    }
    

    Ich komm zwar nicht an ethon oder camper ran, aber wenigstens check ich meinen Code 🙂

    swordfish: 2000000 calls -> 1.065s
    incocnito: 2000000 calls -> 0.701s
    ethon3: 2000000 calls -> 0.509s
    camper: 2000000 calls -> 0.555s

    //edit
    static weggemacht



  • @Incocnito: Was sollen die static ohne const da? Die verhindern dass deine Funktion Thread Safe ist.



  • also bei mir (msvc cl v16) schaut's eher so aus:

    swordfish       12345678        0.08
    incognito       12345678        0.266
    

  • Mod

    theta schrieb:

    @Incocnito: Was sollen die static ohne const da? Die verhindern dass deine Funktion Thread Safe ist.

    Wichtiger noch: sie sind der Geschwindigkeit wahrscheinlich auch nicht förderlich.
    copy und size würde man normalerweise sowieso in Registern finden, und das static beim string verhindert zwar, dass dieser string jedesmal neu erzeugt werden muss, dafür wird beim return immer kopiert. Wäre der string dagegen automatisch, gäbe beim return nichts zu kopieren.



  • Nagut, dann ohne static.

    @Swordfish
    Scheint wohl so als wär was beim messen schiefgelaufen. Jetzt hab ich auch wieder solche Werte

    incocnito	12345678	0.722
    swordfish	12345678	0.539
    ethon3		12345678	0.516
    camper		12345678	0.494
    

    😞 Ach, was solls...
    Immer noch schneller als vorher.



  • Ich hätte noch Folgendes im Angebot:

    template<typename T>
    std::string to_hex_string_tachyon(T val)
    {
        char const * lut = "0123456789abcdef";
        T const mask(~((~T()) << 4));
        std::string str(sizeof(val) * 2, 0);
        std::string::reverse_iterator i = str.rbegin();
    
        while(val > 16)
        {
            *(i++) = lut[val & mask];
            val >>= 4;
        }
        *i = lut[val & mask];
        return str;
    }
    

  • Mod

    Tachyon schrieb:

    Ich hätte noch Folgendes im Angebot:

    template<typename T>
    std::string to_hex_string_tachyon(T val)
    {
        char const * lut = "0123456789abcdef";
        T const mask(~((~T()) << 4));
        std::string str(sizeof(val) * 2, 0);
        std::string::reverse_iterator i = str.rbegin();
        
        while(val > 16)
        {
            *(i++) = lut[val & mask];
            val >>= 4;
        }
        *i = lut[val & mask];
        return str;
    }
    

    Da bleiben allerdings bei kleinen Zahlen führende '\0' drin stehen.



  • camper schrieb:

    Da bleiben allerdings bei kleinen Zahlen führende '\0' drin stehen.

    Da gabs hier schon mehrere Lösungen, wo das der Fall ist. Da haste Dich auch nicht beschwert.


Anmelden zum Antworten