String zu Long, manuell



  • Stellenangebot:

    Putzfrau gesucht
    10 € / Stunde



  • debugmode?

    for(int i=0;i<maxNum;++i) 
            { 
                int k = atoiReano(nr); 
                if(k!=1336543215) 
                    cout << "unmoeglich\n"; 
            }
    

    das das rausoptimiert werden kann, erkennt auch der unfähigste compiler Oo



  • Aber warum dann nicht bei atoiPi oder atoi standart?

    Reano: 20ms
    Pi: 40ms
    Standart: 90ms
    


  • Thorgrim schrieb:

    Ausgabe:

    1.01927ms
    5.02301ms
    

    Für mein System ist das eindeutig, von Unsinn kann da keine Rede sein.

    Hast du im generierten Assembler-Code geprüft, dass deine Schleife nicht einfach komplett rausoptimiert wurde?





  • unskilled schrieb:

    das das rausoptimiert werden kann, erkennt auch der unfähigste compiler Oo

    phyax hat ja schon einen Link gepostet, während ich mir noch den asm-Output angeschaut habe. 20% der Zeit von atoi passt ja auch. Compiler war VC 9, win64 und x64-Code natürlich im Releasemodus, Schleifen nicht rausoptimiert (VC tut sich diesbezüglich immer schwer damit).

    Update:

    0.770659s  Reano
    5.03864s   atoi
    1.17046s   Pi
    123.285s   stringstream
    

    Mit dem alten g++ 4.4

    1.0659s
    5.07371s
    1.09504s
    105.263s
    

    Ich hatte erwähnt, Zeichenfolgen zufällig zusammenzustellen, aber auch bei statischen Zeichenketten optimieren die Compiler nichts weg.



  • Nimm mal den Range-Check raus, dann dürfte meine genau gleich schnell sein, wenn nicht sogar schneller.


  • Mod

    constexpr unsigned long pow10(unsigned long e) {
        return e == 0 ? 0 : pow10( e - 1 ) <= std::numeric_limits<unsigned long>::max() / 10 ? 10 * pow10( e - 1 ) : 0;
    }
    
    template <typename T> struct identity {
        using type = T;
    };
    
    template <std::size_t... i> struct index_list
        : identity<index_list<i...>> {};
    
    template <typename T> struct append_index_list
        : append_index_list<typename T::type> {};
    template <std::size_t... i> struct append_index_list<index_list<i...>>
        : index_list<0, (i+1)...> {};
    
    template <std::size_t N> struct make_index_list
        : append_index_list<make_index_list<N-1>> {};
    template <> struct make_index_list<0>
        : index_list<> {};
    
    template <typename Dim> struct table_pow10
        : table_pow10<typename Dim::type> {};
    template <std::size_t... i> struct table_pow10<index_list<i...>> {
        static const unsigned long data[sizeof...(i)];
    };
    template <std::size_t... i>
    const unsigned long table_pow10<index_list<i...>>::data[] = { ( ( i % 10u ) * pow10( i / 10u ) )... };
    
    unsigned long atoul(const std::string& s)
    {
        unsigned long result = 0;
        const unsigned long* p = table_pow10<make_index_list<10 * ( std::numeric_limits<unsigned long>::digits10 + 1 )>>::data;
        for ( auto i = s.size(); i != 0; p += 10)
            result += p[ s[--i] - '0' ];
        return result;
    }
    

Anmelden zum Antworten