Welche Funktion ist schneller: strcmp oder strlen?



  • dot schrieb:

    dann überleg dir auch das mit C nochmal gut, denn C++ hat gegenüber C wesentliche Vorteile, insbesondere auch was Performance betrifft...

    Muahuahuahuahua!
    Der war gut! 🤡
    Son Schwachsinn hab ich ja schon lange nicht mehr hier gelesen.
    😃



  • Witzigerweise schreiben die GCC Jungs gerade den GCC um, weil C++ im Vergleich zu C Speicher- und Performancevorteile bringt. 😉
    Also so daneben ist die Behauptung wirklich nicht, wenn man aufpasst welche Features man verwendet.



  • Jester schrieb:

    http://www.duden.de/rechtschreibung/komplizieren

    Interessant. Das war mir nicht bewusst. Ich finde die Formulierung befremdlich. "Das kompliziert die Sache" finde ich ok, aber "ich kompliziere maximal" erscheint mir nicht korrekt. Aber ok - ich muss zugeben, dass ich es nicht wirklich weiß.



  • tntnet schrieb:

    Jester schrieb:

    http://www.duden.de/rechtschreibung/komplizieren

    Interessant. Das war mir nicht bewusst. Ich finde die Formulierung befremdlich. "Das kompliziert die Sache" finde ich ok, aber "ich kompliziere maximal" erscheint mir nicht korrekt. Aber ok - ich muss zugeben, dass ich es nicht wirklich weiß.

    Sehe ich genauso. Komplizieren als verb immer ohne Subjekt, also Passivsätze.

    Aktiv nimmt man
    http://www.duden.de/suchen/dudenonline/verkomplizieren



  • Ethon schrieb:

    weil C++ im Vergleich zu C Speicher- und Performancevorteile bringt.

    noch so einer, der an märchen glaubt, unglaublich.
    wer hat euch denn diesen floh bloß ins ohr gesetzt?

    du glaubst also auch, dass
    wenn mann programme mit c++ schreibt, da ein effizienterer maschinencode raus kommt, als wenn man ein programm mit c schreibt 🤡



  • Trollor?!

    Ich kann nur Stoustrup wiederholen. Beispiel qsort: Wenn alle Typinformationen weggeworfen werden und mit void* gearbeitet wird, dann kann der Optimierer/Compiler diese Information nur schwer benutzen.



  • fairy tell believer schrieb:

    du glaubst also auch, dass wenn mann programme mit c++ schreibt, da ein effizienterer maschinencode raus kommt, als wenn man ein programm mit c schreibt 🤡

    Normalerweise nicht, weil viele Programmierer die Effizienz überhaupt nicht mitbeachten.

    Aber wenn man sich nur ein wenig Mühe gibt, baut man bei vergleichbarem Aufwand mit C++ immer schnellere Programme als mit C.



  • knivil schrieb:

    Trollor?!
    Ich kann nur Stoustrup wiederholen. Beispiel qsort: Wenn alle Typinformationen weggeworfen werden und mit void* gearbeitet wird, dann kann der Optimierer/Compiler diese Information nur schwer benutzen.

    ob der compiler das schwer hat oder nicht interessiert doch niemanden.
    und wegen einer eventuell möglichen optimierung, wegen eines features gleich auf allgemeine eigenschaften zu schließen ist ein wenig albern, findest du nicht?

    volkard schrieb:

    Aber wenn man sich nur ein wenig Mühe gibt, baut man bei vergleichbarem Aufwand mit C++ immer schnellere Programme als mit C.

    die begründung täte mich doch interessieren sehr.


  • Mod

    fairy tell believer schrieb:

    ob der compiler das schwer hat oder nicht interessiert doch niemanden.

    Doch, das ist sogar ganz entscheidend, denn hier ist Schwer = Unmöglich.

    und wegen einer eventuell möglichen optimierung, wegen eines features gleich auf allgemeine eigenschaften zu schließen ist ein wenig albern, findest du nicht?

    Wenn es ein entscheidendes Feature ist, das andauernd benutzt wird?

    volkard schrieb:

    Aber wenn man sich nur ein wenig Mühe gibt, baut man bei vergleichbarem Aufwand mit C++ immer schnellere Programme als mit C.

    die begründung täte mich doch interessieren sehr.

    Siehe oben. Die Anpassung von allgemeinen Algorithmen auf spezielle Gegebenheiten geht in C++ so einfach, dass man es nicht einmal bemerkt. Dadurch steht eine große Vorauswahl fertiger Algorithmen bereit, die trotzdem auf das konkrete Problem bezogen optimal umgesetzt werden. Dies verringert den Entwicklungsaufwand erheblich, trotzdem wird optimaler Code erzeugt. Um den gleichen optimalen Code zu erzeugen müsste man in C selber Hand anlegen (->großer Aufwand). Für vergleichbar geringen Aufwand müsste man sich hingegen mit suboptimalen Mitteln beim Benutzen von typenunabhängigem Code zufrieden geben (->langsam).

    Das war nur ein Feature. Allgemein hat man natürlich noch ganz andere Features, die den Entwicklungsaufwand erheblich verringern, dabei aber zu dem üblichen Vorgehen in C gleichwertigen (oder manchmal sogar besseren: Exceptions) Code erzeugen, so dass man bei gleichem Aufwand mehr Zeit für Optimierungen hat, wohingegen der C-Programmierer noch Zeit verschwenden muss, zu prüfen, ob seine Speicherfreigabestrategie auch wirklich idiotensicher ist.

    P.S.: Bitte lerne Englisch!



  • fairy tell believer schrieb:

    volkard schrieb:

    Aber wenn man sich nur ein wenig Mühe gibt, baut man bei vergleichbarem Aufwand mit C++ immer schnellere Programme als mit C.

    die begründung täte mich doch interessieren sehr.

    Weil es so schnelle Sachen wie std::sort gibt. Oder Strings, die ihre Länge kennen. Die kann man einfach mal nehmen. Und wenn sie nicht passen, nimmt man sie nicht, allerschlimmstenfalls geht man wie in C vor. Und weil man mit Klassen und Templates weiter abstrahieren kann, ganz ohne Ovberhead, da spart man Zeit, macht weniger Fehler, also hat man mehr Zeit und Möglichkeiten, an Performance zu denken. RAII und Exceptions sorgen dafür, daß man nicht mehr 50% des Codes mit Fehlerbehandlung vollballern muss (und Exceptions sind schneller).



  • Na dann ist doch alles klar.
    C++ und geringerer Entwicklungsaufwand: dem stimme ich voll und ganz zu.
    C++ Programme performanter als C: no way, weil C++ keinen Maschinencode erzeugt, der performanter ist.

    Btw. kann ich mir in C einen Sortieralgo auch selber schreiben, wenn mir qsort zu lahm sein sollte.



  • fairy story schrieb:

    Btw. kann ich mir in C einen Sortieralgo auch selber schreiben, wenn mir qsort zu lahm sein sollte.

    Das ruft nach einem Vergleich.
    Sagen wir mal, einen um 1G großen Eingabestrom wortweise lesen (whitspace als trenner). Stoppuhr starten. Sortieren. Stoppuhr stoppen. Doppeleinträge löschen. Anzahl der ubrigen Einträge anzeigen. Sortierzeit anzeigen.



  • fairy story schrieb:

    Btw. kann ich mir in C einen Sortieralgo auch selber schreiben, wenn mir qsort zu lahm sein sollte.

    Schwachsinn, das offensichtliche Gegenbeispiel qsort vs. std::sort wurde ja schon genannt...



  • volkard schrieb:

    Das ruft nach einem Vergleich.

    Ok.

    // wird dynamisch dazugelinkt
    void g(int *);
    
    void f(int i) {
      int v1[i];
      g(v1);
      int v2[i];
      g(v2);
      {
        int v3[i];
        g(v3);
      }
      g(v2);
    }
    
    int main() {
      register int i;
      for (i=0; i<LOOPS; ++i)
        f(i&0xFF);
    }
    

    vs

    #include <vector>
    
    // wird dynamisch dazugelinkt
    void g(int *);
    
    void f(int i) {
      std::vector<int> v1(i); // Echte C++-Programmierer verwenden Vektor
      g(v1.data());
      std::vector<int> v2(i); // manchmal auch zwei
      g(v2.data());
      {
        std::vector<int> v3(i); // oder drei
        g(v3.data());
      }
      g(v2.data());
    }
    
    int main() {
      for (int i=0; i<LOOPS; ++i)
        try {f(i&0xFF);}catch(...){}
    }
    
    void g(int* x) { }
    

    Dann

    gcc -Ofast -c g.c
    gcc -DLOOPS=10000000 -Ofast -c c.c
    gcc g.o c.o -o c
    
    g++ -Ofast -c g.c
    g++ -DLOOPS=10000000 -Ofast -c cc.cc
    g++ g.o cc.o -o cc
    
    time ./c  
    time ./cc
    stat -c%s c cc
    

    Ergibt

    0.13user 0.00system 0:00.13elapsed 100%CPU (0avgtext+0avgdata 312maxresident)k
    0inputs+0outputs (0major+117minor)pagefaults 0swaps
    5.29user 0.00system 0:05.30elapsed 99%CPU (0avgtext+0avgdata 728maxresident)k
    0inputs+0outputs (0major+239minor)pagefaults 0swaps
    5145
    6874

    Mit -flto (und -Ofast beim Linken) komme ich sogar auf

    0.00user 0.00system 0:00.00elapsed 80%CPU (0avgtext+0avgdata 340maxresident)k
    0inputs+0outputs (0major+128minor)pagefaults 0swaps
    5.12user 0.00system 0:05.17elapsed 99%CPU (0avgtext+0avgdata 724maxresident)k
    0inputs+0outputs (0major+239minor)pagefaults 0swaps
    7668
    9112

    Die letzten zwei Zahlen zeigen übrigens die Dateigrösse an.

    An dem Beispiel sieht man mehrere Fakten

    • Vektor für alles (diese Aussage wird einem in diesem Forum eingetrichtert) ist eine ziemlich schlechte Idee. Der Ansatz statische Arrays wo möglich ist in C++ leider verpönt.
    • RAII und Exceptions sorgen dafür, daß der Compiler 50% des Codes mit Fehlerbehandlung vollballern muss (was zu viel mehr Anweisungen und dadurch Cache-Problemen führt)
    • Der C++-Compiler kann viel weniger optimieren, weil alles Seiteneffekte hat.

  • Mod

    dot schrieb:

    fairy story schrieb:

    Btw. kann ich mir in C einen Sortieralgo auch selber schreiben, wenn mir qsort zu lahm sein sollte.

    Schwachsinn, das offensichtliche Gegenbeispiel qsort vs. std::sort wurde ja schon genannt...

    Recht hat er schon, aber er widerlegt sich damit auch selber. Ein selbst geschriebenes, spezialisiertes qsort kann so schnell sein wie std::sort. Das ist doch gerade das Problem, dass der C++-Programmierer bloß eine Zeile schnell hinkritzeln braucht, während in C an dieser Stelle eine nicht unwesentliche Entwicklungsarbeit nötig ist. Ein paar Stunden gehen da gewiss drauf. Mehr, wenn man nicht irgendwo abschreibt sondern noch selber recherchiert, welcher Algorithmus der beste wäre und wie er optimal implementiert wird.



  • @objdump: Nun, ich hoffe das Beispiel ist nicht ganz ernst gemeint.



  • objdump schrieb:

    volkard schrieb:

    Das ruft nach einem Vergleich.

    Ok.

    // wird dynamisch dazugelinkt
    void g(int *);
    
    void f(int i) {
      int v1[i];
      g(v1);
      int v2[i];
      g(v2);
      {
        int v3[i];
        g(v3);
      }
      g(v2);
    }
    
    int main() {
      register int i;
      for (i=0; i<LOOPS; ++i)
        f(i&0xFF);
    }
    

    vs

    #include <vector>
    
    // wird dynamisch dazugelinkt
    void g(int *);
    
    void f(int i) {
      std::vector<int> v1(i); // Echte C++-Programmierer verwenden Vektor
      g(v1.data());
      std::vector<int> v2(i); // manchmal auch zwei
      g(v2.data());
      {
        std::vector<int> v3(i); // oder drei
        g(v3.data());
      }
      g(v2.data());
    }
    
    int main() {
      for (int i=0; i<LOOPS; ++i)
        try {f(i&0xFF);}catch(...){}
    }
    
    void g(int* x) { }
    

    Dann

    gcc -Ofast -c g.c
    gcc -DLOOPS=10000000 -Ofast -c c.c
    gcc g.o c.o -o c
    
    g++ -Ofast -c g.c
    g++ -DLOOPS=10000000 -Ofast -c cc.cc
    g++ g.o cc.o -o cc
    
    time ./c  
    time ./cc
    stat -c%s c cc
    

    Ergibt

    0.13user 0.00system 0:00.13elapsed 100%CPU (0avgtext+0avgdata 312maxresident)k
    0inputs+0outputs (0major+117minor)pagefaults 0swaps
    5.29user 0.00system 0:05.30elapsed 99%CPU (0avgtext+0avgdata 728maxresident)k
    0inputs+0outputs (0major+239minor)pagefaults 0swaps
    5145
    6874

    Mit -flto (und -Ofast beim Linken) komme ich sogar auf

    0.00user 0.00system 0:00.00elapsed 80%CPU (0avgtext+0avgdata 340maxresident)k
    0inputs+0outputs (0major+128minor)pagefaults 0swaps
    5.12user 0.00system 0:05.17elapsed 99%CPU (0avgtext+0avgdata 724maxresident)k
    0inputs+0outputs (0major+239minor)pagefaults 0swaps
    7668
    9112

    Die letzten zwei Zahlen zeigen übrigens die Dateigrösse an.

    An dem Beispiel sieht man mehrere Fakten

    • Vektor für alles (diese Aussage wird einem in diesem Forum eingetrichtert) ist eine ziemlich schlechte Idee. Der Ansatz statische Arrays wo möglich ist in C++ leider verpönt.
    • RAII und Exceptions sorgen dafür, daß der Compiler 50% des Codes mit Fehlerbehandlung vollballern muss (was zu viel mehr Anweisungen und dadurch Cache-Problemen führt)
    • Der C++-Compiler kann viel weniger optimieren, weil alles Seiteneffekte hat.

    Das ist ein Test, der gar nichts tut. Eine tunichts.exe ist in C schneller und kleiner. *applause*
    Normalerweise wird ein Array der Größe i auch i Nutzdaten halten und irgendwas mit ihnen machen. Kann schon sein, daß manche extrem ungeschickte Implemetierung in C schneller ist, wenn man sie mit Gewalt genauso ungeschickt in C++ schreibt. *hihi*



  • SeppJ schrieb:

    dot schrieb:

    fairy story schrieb:

    Btw. kann ich mir in C einen Sortieralgo auch selber schreiben, wenn mir qsort zu lahm sein sollte.

    Schwachsinn, das offensichtliche Gegenbeispiel qsort vs. std::sort wurde ja schon genannt...

    Recht hat er schon, aber er widerlegt sich damit auch selber. Ein selbst geschriebenes, spezialisiertes qsort kann so schnell sein wie std::sort. Das ist doch gerade das Problem, dass der C++-Programmierer bloß eine Zeile schnell hinkritzeln braucht, während in C an dieser Stelle eine nicht unwesentliche Entwicklungsarbeit nötig ist. Ein paar Stunden gehen da gewiss drauf. Mehr, wenn man nicht irgendwo abschreibt sondern noch selber recherchiert, welcher Algorithmus der beste wäre und wie er optimal implementiert wird.

    Richtig, da hab ich die falsche Stelle zitiert, ich wollte eigentlich die Zeile drüber zitieren:

    fairy story schrieb:

    C++ Programme performanter als C: no way, weil C++ keinen Maschinencode erzeugt, der performanter ist.

    Das ist absoluter Schwachsinn; die Probleme mit der Aussage von wegen selbst schreiben hast du ja schon aufgezeigt...



  • SeppJ schrieb:

    Ein selbst geschriebenes, spezialisiertes qsort kann so schnell sein wie std::sort.

    Es gibt doch genau 3 Fälle:
    a) Performance egal: qsort völlig ausreichend, sogar besser als std::sort, weil das Binary viel viel viel kleiner wird.
    b) Performance wichtig: std::sort ist ungeeignet, weil viel zu allgemein. Eine Liste von Integern sortiert man am besten mit Radix-Sort. Kann C++ auch nicht. Für Strings nimmt man tries. Kann C++ genauso wenig.
    c) Kurze Entwicklungszeit wichtig, Code soll möglichst schnell sein: Hier nimmt man die 80-20-Regel zu Hilfe. Erstmal qsort nehmen, da entwickelt es sich in C genauso schnell wie C++. Über Wochen hinweg sammeln sich mehrere Stunden an, die der C-Compiler weniger benötigt als C++-Compiler. Diese investiert man dann in die 20% ausgeführten Code => C-Programm schneller.



  • Troll.


Anmelden zum Antworten