blödsinn im C++ Buch?



  • Ich habe mir vor 3Tagen das C++ Buch von Stanley B. Lippman, Josee Lajoie von einem Freund ausgeborgt und habe heute folgendes gelesen

    [wissen]
    Im Durchschnitt wird die Implementierung mit der string Klasse doppelt so
    schnell ausgeführt wie die Implementierung im C-Stil. Der Unix-Befehl timex
    gibt folgende Durchschnittszeiten für die Programmausführung an:

    user 0.65 # string klasse
    user 1.98 # char-string
    [/wissen]

    also ehrlich gesagt das halte ich für Blödsinn ich habe diese Klasse schon so oft verwendet und die char-string noch öffters,
    habe diese auch schon mit dem asm befehl read time stamper count auf Schnelligkeit geprüft und heute das selbe auf Debian getestet und es waren immer die char-strings schneller also

    steht da scheise in dem buch oder mach ich scheise???



  • Was wird denn in diesem Test getestet ??
    Die Geschwindigkeit hängt wohl in erster Linie von den Operationen ab die du
    durchführst. Im Allgemeinen wird die Implementierung von STL-Strings als ziemlich
    performant erachtet.

    mfg JJ



  • naja es wird ein "langer" String eine Million Mal kopiert und danach geprüft ob der kopierte String gleich dem Basis String ist



  • std::string hat den vorteil von intelligenten Buffern und guten Allocatoren sowie so optimierungen wie COW, short string optimization, etc.

    also hat std::string idR das bessere potential.

    allerdings kann das bei einer schlechten STL implementierung wie zB beim VC++6 ins negative wechseln (wenn eben diese optimierungen nicht gemacht werden).

    Auch kann es sein, dass fuer den aktuellen Code diese sachen irrelevant sind (zB fixe string groesse auf dem stack) und so std::string langsamer ist.



  • leo aka qsch schrieb:

    naja es wird ein "langer" String eine Million Mal kopiert und danach geprüft ob der kopierte String gleich dem Basis String ist

    Das kann durchaus so sein, dass hier std::string deutlich schneller arbeitet. C-Strings sind nunmal nicht sonderlich performant, da durch das terminierende Nullzeichen jedes Zeichen einzeln verarbeitet werden muss. Eine std::string Implementierung kann hier deutlich performanter aussehen.
    Wenn man die Aussage

    Im Durchschnitt wird die Implementierung mit der string Klasse doppelt so
    schnell ausgeführt wie die Implementierung im C-Stil.

    allerdings allgemein betrachtet ist sie natürlich Käse, da ein Programm normalerweise noch mehr macht als nur String Manipulation.



  • naja was mich wundert ist das sowohl unter vc++6 als auch unter g++
    die Verarbeitung der char-string bei dem gleichen bsp aus dem Buch deutlich schneller ist als die der stl implementierung

    es ist mir schon klar das die Operationen die auf die Strings angewendet und auch die Größe des Buffers der verarbeitet werden soll Einfluss auf die Geschwindigkeit haben, das was mich aber irretiert ist, das bei diesem Beispiel im Buch die Geschwindigkeitsmessung nicht mit meinen übereinstimmt



  • leo aka qsch schrieb:

    naja was mich wundert ist das sowohl unter vc++6 als auch unter g++
    die Verarbeitung der char-string bei dem gleichen bsp aus dem Buch deutlich schneller ist als die der stl implementierung

    VC++6 kannst du vergessen. Die STL ist einfach nur mies 😞 da ist es am besten STLPort zu verwenden.

    Welche gcc Version hast du denn?

    Naja, wenn du keinen Code postest, kann man schwer was dazu sagen.

    Aber bedenke halt: es haengt alles von der STL Implementierung ab, und diese hat Moeglichkeiten die ein plain C String nicht hat (inwiefern das ein Vorteil oder Nachteil ist, haengt von der aktuellen Situation ab).

    Benchmarks sind deshalb idR nicht aussagekraeftig.

    "Wer misst, misst Mist"



  • g++ v3.3.5

    hier mal schnell der code unter win, beim linux code unterscheidet sich halt nur der Aufruf von rdtsc

    // Zeitmessung
    struct __time_genau {
    	int nano;
    	int micro;
    	int sec;
    	int milli;
    } x;
    
    inline __int64 readc() {
        __asm rdtsc
    }
    
    void unterschied(__int64 diff) {
        //__int64 speed = 7975019;
    
    	x.sec =((diff/7975019)/1000);
    	x.sec &=63;
    	x.mili = (diff/7975019);
    	x.mili &= 1023;
    	x.mikro=((diff*1000)/7975019);
    	x.mikro &= 1023;
    	x.nano = ((diff*1000000)/7975019);
    	x.nano &= 1023;
    
        printf("\n\n%d", diff);
    }
    
    // Aufruf
    void fo
    {
        time1 = readc(); // long long
        test();
        time2 = readc();
        unterschied(time2-time1);
    
        time1 = readc(); // long long
        teststl();
        time2 = readc();
        unterschied(time2-time1);
    }
    
    void test()
    {
    	int errors = 0;
    	const char *pc = "ein sehr langer Literal-String";
    
    	for (int ix = 0; ix < 1000000; ++ix)
    	{
    		int length = strlen( pc );
    		char *pc2 = new char[length +1];
    		strcpy(pc2, pc);
    		if (strcmp(pc2, pc))
    			++errors;
    
    		delete[] pc2;
    	}
    	cout << errors;
    }
    
    void teststl()
    {
    	int errors = 0;
    	string str( "ein sehr langer Literal-String" );
    
    	for (int ix = 0; ix < 1000000; ++ix)
    	{
    		int length = str.length();
    		string str2 = str;
    		if ( str != str2 )
    			++errors;
    	}
    	cout << errors;
    }
    

    btw: STLPort werd ich mir anschaun und
    der Merksatz gefällt mir 🙂


Anmelden zum Antworten