Welche Funktion ist schneller: strcmp oder strlen?



  • ich bins...threadstarter schrieb:

    @RonjaRaeuber
    danke... für nichts.
    Die von dir gepostete Quelle hat irgendwie keine aussagekraft.
    dass "strlen length 1" weniger zeit braucht als "strcmp length 33, -1" (was auch immer das -1 bedeutet soll) hätte ich mir irgendwie noch gerade so erschließen können.
    google ist halt doch kein wunderheilmittel.

    strlen length 33 415 us [830]
    strcmp length 33, -1 116 us [232]

    Es gibt da ja noch mehr als strlen von 1... und im Quellcode siehst du auch, was das -1 ist, nämlich das Ergebnis von strcmp (strings sind ungleich, bzw string 1 kleiner als der zweite)



  • Wenn deine Anwendung derart performancekritisch ist, solltest du dir überhaupt mal die Frage stellen, ob nullterminierte Strings denn die richtige Lösung sind. Statt Nullterminierung kann man z.B. auch einfach die Länge des String separat speichern, was viele Dinge unter Umständen wesentlich effizienter gestaltet. Und wenn du schon dabei bist, Entscheidungen zu hinterfragen, dann überleg dir auch das mit C nochmal gut, denn C++ hat gegenüber C wesentliche Vorteile, insbesondere auch was Performance betrifft...



  • threadstarter schrieb:

    ich will die sache nicht maximal kompilizieren.

    ich bins...threadstarter schrieb:

    @tntnet
    was findest du denn an "maximal kompiliziert" komisch? 🙂

    "Komplizieren" gibt es in der deutschen Sprache nicht als Verb. Das ist komisch. "Ich will die Sache nicht maximal kompliziert machen" geht.

    Mechanics schrieb:

    tntnet schrieb:

    Das bedeutet entweder mehr Komplexität oder die Verwendung von C++

    Ist ja jetzt nicht so, dass man in C keine Hashes implementieren könnte. Es gibt z.B. die apr Bibliothek, wahrscheinlich auch zig andere.

    Natürlich kann man in C Hashtabellen implementieren. Oder fertige von der Stange nehmen. Ich mag halt C++, da man dort solche Sachen in einfache und robuste Interfaces packen kann. Ein einfaches Beispiel wäre auch das qsort in C im Gegensatz zum std::sort in C++. Beides implementiert einen Sortieralgorithmus. Bei C muss ich mit void pointern hantieren und die Größe der Elemente mit geben. Bei C++ bleibt mir das erspart.



  • tntnet schrieb:

    ich bins...threadstarter schrieb:

    @tntnet
    was findest du denn an "maximal kompiliziert" komisch? 🙂

    "Komplizieren" gibt es in der deutschen Sprache nicht als Verb. Das ist komisch. "Ich will die Sache nicht maximal kompliziert machen" geht.

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



  • 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.


Anmelden zum Antworten