Beweis: C ist schneller als C++ am Beispiel von std::vector



  • Programmiersprache: C
    Laufzeit: ca. 10 Sekunden

    #include <string.h>
    #include <stdlib.h>
    
    int main()
    {
    	int i;
    
    	for(i = 0; i < 10000000; ++i)
    	{
    		char* pBuffer = malloc(4000);
    		memset(pBuffer, 0, 4000);
    		free(pBuffer);
    	}
    }
    

    Programmiersprache: C++
    Laufzeit: ca. 1 Minute und 16 Sekunden

    #include <vector>
    
    int main()
    {
    	for(int i = 0; i < 10000000; ++i)
    	{
    		std::vector<char> v(4000);
    	}
    }
    

    Beide Programme wurden mit Visual C++ 2005 im Release-Modus kompiliert.

    Wie kann so ein riesen Unterschied zustande kommen? Liegt das an der Default-Initialisierung von std::vector? Kann diese vielleicht nicht auf ein memset optimiert werden?



  • Der Vergleich hinkt. Denn vector macht nebenbei noch ein paar andere Sachen. Z.B. wird in deinem Beispiel über 10 Mio. mal der Konstruktor und Destruktor von vector aufgerufen. Also 20 Mio. zusätzliche Funktionsaufrufe mehr als in deinem C-Beispiel. Klar, so sind die Aufrufe... nutzlos. Aber genauso nutzlos wie dein Beispiel selbst. Aber lass mal dein C-Beispiel ein paar Sachen mehr machen, die sonst C++ autom. im Hintergrund schalten und walten lässt.

    Naja, das ist jetzt meine spontane Vermutung, warum dein Beispiel so große UNterschiede bringt.



  • Das als Beweis anzuführen, daß eine Programmiersprache schneller ist als eine andere ist schlichtweg falsch. Das zeigt höchstens, daß eine bestimmte Implementierung einer einzelnen Funktion schneller oder langsamer ist.

    Ich habe es hier mal auf die Schnelle auf einem Debian-GNU/Linux-System getestet. Das Resultat ist hier:

    > time ./ttt_c
    
    real    0m7.523s
    user    0m6.800s
    sys     0m0.016s
    
    > time ./ttt_cpp
    
    real    0m7.072s
    user    0m7.052s
    sys     0m0.008s
    

    Die Laufzeiten sind also fast identisch.

    Tntnet



  • es ist nur ein beweis dafür wie schlecht visual c++ optimiert.



  • Ja, hängt wahrscheinlich auch vom Allokator ab, der für vector benutzt wird. Meistens ist es einer für mittelgroße bis große Speicherbereiche. In "Modernes C++ Design" wird z.B. gezeigt, wie man sich einen Allokator für kleine Speicherbereiche schreiben kann, der dann wohl abgehen soll, wie ein Zäpfchen. 😃



  • Antwort schrieb:

    es ist nur ein beweis dafür wie schlecht visual c++ optimiert.

    Nein, hat nichts mit dem Compiler zu tun. Der ist schon gut. Wenn dann ist eher Dinkumware "schuld", die die Stdlib liefern.

    Wobei man sich schon fragt, welcher Programmierer solch einen Programmablauf programmiert? 🙄



  • Es scheint wirklich am Compiler bzw dessen Library zu liegen. Mit g++ ist es etwa genauso schnell wie die C Version.

    Übrigens, folgender Code braucht auch unter VC++ nur 10 Sekunden

    for(int i = 0; i < 10000000; ++i)
    {
        std::vector<char> v;
        v.insert(v.begin(), 4000, char());
    }
    

    Das finde ich schon sehr merkwürdig.



  • Warum eigentlich malloc und memset in C? Warum nicht gleich calloc? Naja, der Vergleich ist eh albern.



  • Also ich hab jetzt die große Schwachstelle entdeckt.

    1 Million mal

    std::vector<char> v;
    v.resize(4000);
    

    dauert bei mir ca. 11 Sekunden

    und 1 Million mal

    std::vector<char> v(4000);
    

    dauert ca. 77 Sekunden. 😮 😮

    Ich dachte immer das wäre komplett das selbe! Besteht da wirklich ein Unterschied? Wenn ja, welcher? Bitte lasst es mich verstehen. 🙂

    @TactX: An die Funktion hab ich nicht gedacht. 😉



  • Schau dir den einfach den Quellcode an...


  • Administrator

    Und wenn schon überhaupt, stimmt das doch gar nicht. So kann man das doch nicht vergleichen. Wenn schon müsste man es vom C-Beispiel ausgehend folgendermasen machen:

    // Die C-Variante
    for(int i = 0; i < 10000000; ++i)
    {
        char* pBuffer = malloc(4000);
        free(pBuffer);
    }
    
    // Die C++-Variante
    for(int i = 0; i < 10000000; ++i)
    {
        char* pBuffer = new char[4000];
        delete [] pBuffer;
    }
    

    Sonst hat das eine ja nichts mit dem anderen zu tun. Oder irre ich mich 😕

    Grüssli



  • toll.

    dummerweise hast du wohl verpennt, das es um Schnelligkeit garnicht mehr geht.
    Wenn du etwas verkaufst, und es halbwegs richtig programmiert ist, ist es schnell genug.
    Ob nun mit C das 10% schneller ist oder nicht interessiert keinen. Und wenn doch, verkaufst
    du dem Kunden halt eine schnellere Hardware, damit "optimierst" du dann dein Programm um einiges
    mehr, als es C jemals gekonnt hätte.
    Und wenn wir über Software reden, müssen wir auch über Wartungs und Entwicklungsaufwand reden,
    C kann keine OOP, keine Templates, bei komplexeren Problemstellungen wirst du also schnell einen
    erheblichen Mehraufwand haben.



  • @aufdecker:
    Aus irgendeinem Grund verwendet die resize Version memset und die ctor Version nicht. Guck dir den Source an wenn du magst, mich interessiert das jetzt nicht wirklich ausreichend mich da reinzukämpfen. Und dass memset schneller ist ist kein Wunder, da memset hoch optimiert ist, und nicht jedes Byte einzeln setzt, sondern mit speziellen Instruktionen mehrere (zumindest 16 denke ich) auf einmal.

    Sobald du die "intrinsic functions" einschaltest ist die memset Variante gleich langsam, da dann die optimierte Version von memset nicht verwendet wird sondern einfach "rep stosb".

    Im übrigen ist malloc+memset mit einem vector zu vergleichen doof, wenn dann müsstest du auf der C++ Seite schon "new char[]" und "uninitialized_fill_n" verwenden. Naja, whatevern.



  • Dravere schrieb:

    Und wenn schon überhaupt, stimmt das doch gar nicht. So kann man das doch nicht vergleichen. Wenn schon müsste man es vom C-Beispiel ausgehend folgendermasen machen:

    // Die C-Variante
    for(int i = 0; i < 10000000; ++i)
    {
        char* pBuffer = malloc(4000);
        free(pBuffer);
    }
    
    // Die C++-Variante
    for(int i = 0; i < 10000000; ++i)
    {
        char* pBuffer = new char[4000];
        delete [] pBuffer;
    }
    

    Sonst hat das eine ja nichts mit dem anderen zu tun. Oder irre ich mich 😕

    Grüssli

    Nein, finde ich auch. Ein Vergleich sollte eine bestimmte Aufgabe lösen und in der jeweiligen Sprache optimal gecoded, so wie im Zitat.
    C++ ist eine Erweiterung von C und kann logischerweise auch so benutzt werden.



  • ACHTUNG !!!! ACHTUNG !!!!

    Obwohl es die da oben nicht wahrhaben wollen und seit Jahren mit illegalen Machenschaften versuchen, die Wahrheit und den kleinen Mann zu unterdrücken, hier der Triumph der Freiheit: Der Beweis, dass Word langsamer ist als C.

    Anlegen von 40.000.000.000 (40 Mrd) Zeichen
    - in C (Programm mit malloc vom Aufdecker): 10 Sekunden
    - in Word (Eintippen mit Zeitmessung und Interpolation) : knapp 127 Jahre !!!

    Wie lange dauert es noch, bis die Politik reagiert und die Konsequenzen zieht ?
    Wann wird Bill Gates endlich der Gerechtigkeit des Volkes übergeben ?

    Wordnutzer aller Welt: Vereinigt Euch !!

    Gruß,

    Simon2.



  • Simon2 schrieb:

    ACHTUNG !!!! ACHTUNG !!!!

    Obwohl es die da oben nicht wahrhaben wollen und seit Jahren mit illegalen Machenschaften versuchen, die Wahrheit und den kleinen Mann zu unterdrücken, hier der Triumph der Freiheit: Der Beweis, dass Word langsamer ist als C.

    Anlegen von 40.000.000.000 (40 Mrd) Zeichen
    - in C (Programm mit malloc vom Aufdecker): 10 Sekunden
    - in Word (Eintippen mit Zeitmessung und Interpolation) : knapp 127 Jahre !!!

    Wie lange dauert es noch, bis die Politik reagiert und die Konsequenzen zieht ?
    Wann wird Bill Gates endlich der Gerechtigkeit des Volkes übergeben ?

    Wordnutzer aller Welt: Vereinigt Euch !!

    Gruß,

    Simon2.

    Idiot.



  • Kener schrieb:

    ...Idiot.

    Angenehm ! Simon2.

    Gruß,

    Simon2.



  • 😃 🤡 😃



  • wo soll hier der gag liegen? dass c einiges schneller sein kann als c++ ist doch wohl allen klar die oop verwenden. dafür ist das konzept stimmiger. hardware wird doch alle 18 monate doppelt so schnell. da kann man dann schon von assembler weg gehen und vielfach verschachtelte hochsprachen verwenden. 😉



  • marc--us schrieb:

    ...dass c einiges schneller sein kann als c++ ist doch wohl allen klar...

    Also mir nicht. Da oben werden (wie so oft) "Ä mit B" verglichen. vector<> macht einfach was Anderes als ein malloc/free-Paar. Wenn man nur das Letztere braucht, kann man in C++ new[]/delete[] verwenden unst ist plötzlich genauso schnell.

    Wenn ich new[]/delete[] mit einer gleichmächtigen selbstgeschriebene C-Vektor-Klasse vergleiche, wird mir plötzlich auffallen, dass "C++ viel schneller ist als C".....

    Gruß,

    Simon2.


Log in to reply