Welche Funktion ist schneller: strcmp oder strlen?


  • Mod

    Bezüglich der Performance der Stringübergabe haben übrigens std::move und Link Time Optimierung angerufen und wollten sich mal vorstellen, dass sie seit einiger Zeit hier in der Gegend wohnen. Die LTO behauptet übrigens, sich auch mit C auszukennen.
    Ich habe hier auch noch eine Postkarte von einer gewissen Copy on write Optimierung, auf der ganz viel zu dem Thema steht. Die Karte scheint aber schon etwas älter zu sein, ich weiß nicht, ob die noch aktuell ist.
    🤡



  • SeppJ schrieb:

    Bezüglich der Performance der Stringübergabe haben übrigens std::move und Link Time Optimierung angerufen und wollten sich mal vorstellen, dass sie seit einiger Zeit hier in der Gegend wohnen. Die LTO behauptet übrigens, sich auch mit C auszukennen.

    Ja, manche Probleme von C++ lösen sich durch höchstkomplexe Optimierungen moderner Compiler. Entsprechend lang dauert auch die Compilezeit. Aber wie viel Zeit ist zwischen dem Kopierkonstruktor und move/LTO vergangen? Ich würde sagen einige.

    Andere Problem kann der C++ aber nicht lösen, eben eine schöne Anordnung des Speichers. Zeig mir mal, wie du ein Array in einer C++-Klasse einbettest, also benutzerfreundlicherString implementieren würdest.

    Angenommen, ein Array von Strings soll umgedreht werden. Ein benutzerfreundlicherString -Array braucht dazu n/2 Pointer-swaps. Ein vector<string> dagegen 3 mal mehr.

    SeppJ schrieb:

    Ich habe hier auch noch eine Postkarte von einer gewissen Copy on write Optimierung, auf der ganz viel zu dem Thema steht. Die Karte scheint aber schon etwas älter zu sein, ich weiß nicht, ob die noch aktuell ist.
    🤡

    COW kann auch nur C++-ern in den Sinn kommen 🙄



  • Es wird objdump überraschen, aber durch Mikrooptimierung bekommt keine Anwendung brutale Performance, sondern dadurch, daß die Entwickler schlaue Algorithmen und Datenstrukturen verwenden, und was am allerwichtigsten ist, die Übersicht behalten.



  • @objdump

    Falscher Ansatz, wenn ich Dau spiele, ist C++ auch nicht sicher.

    Falsch. Und überhaupt komplette falsche Denkweise. Ich will nicht jemanden ankotzen sondern eine Funktion weniger fehleranfällig machen. Da ist mir so ein DAU Ansatz manchmal recht lieb. Man programmiert auch dass ein anderer Benutzer Code XYZ benutzen kann und dieser nicht unbeabsichtigt falsch benutzt oder wenn nur schwer falsch benutzen kann!

    C ist keine Sprache für Daus, die sollen auf C++ wechseln.

    Lass mich raten: C ist eine Sprache für Profis und sollte nur von Profis verwendet werden.

    Dass NULL hier als Parameter sinnlos ist, dürfte selbsterklärend sein (spätestens nach dem nächsten Segfault, der unmittelbar auftritt)

    Erklär das mal einem Kunden. Ähh Entschuldigung, wir haben nicht genug getestet und haben deswegen noch ein Segfault. Sie bekommen in 5 Minuten ihr Bugfix zugesendet...

    und dass ich die Parameter für strcpy vertauscht habe, meldet mir mein Compiler.

    Das bezeifele ich. Deine Eingabeparameter sind nicht const, also darf ich etwas problemlos andere Daten drüberkopieren. Abhängig vom Compiler dürfte er entweder direkt abstürzen oder auch Schrott drüberkopieren. Ein strlen((char*) malloc(8)); geht bei mir problemlos.

    Zeigerfehler, die auch mir passieren können, findet valgrind im nächsten Test.

    Auch eine Art des Programmieren. Scheiß auf evt. Fehler. Wozu gibts valgrind. Geil. 😉

    Volkard schrieb:

    Es wird objdump überraschen, aber durch Mikrooptimierung bekommt keine Anwendung brutale Performance, sondern dadurch, daß die Entwickler schlaue Algorithmen und Datenstrukturen verwenden, und was am allerwichtigsten ist, die Übersicht behalten.

    Wie ineffizient. Tss 😃

    Bedeutet nicht Effiziens die sorgsame Aufzucht und Pflege von vermeidbaren Fehlern unter dem Deckmantel ein paar Takte sparen zu können?



  • gähn
    🙄



  • Es wird volkard überraschen, aber als ich das letzte mal C++ programmiert habe, habe ich immer brav const& Schnittstellen gemacht, bis ich irgendwann gemerkt habe, dass in-place-ändern doch besser wäre. In der Folge musste ich immer alles kopieren, was die Performance massiv beeinträchtigt hat. Seither bleibe ich in C bei dummen structs und klugen Algorithmen.

    C ist eine Sprache für Profis und sollte nur von Profis verwendet werden.

    👍



  • C ist eine Sprache für Profis und sollte nur von Profis verwendet werden.

    full ack! 👍



  • objdump schrieb:

    Es wird volkard überraschen, aber als ich das letzte mal C++ programmiert habe, habe ich immer brav const& Schnittstellen gemacht, bis ich irgendwann gemerkt habe, dass in-place-ändern doch besser wäre. In der Folge musste ich immer alles kopieren, was die Performance massiv beeinträchtigt hat. Seither bleibe ich in C bei dummen structs und klugen Algorithmen.

    Vielleicht haste nur die falschen C++-Bücher in der Hand gehabt. Wenn die Dir einen Stil einreden wollten, der bremst, ist klar, daß Du Dich da unwohl fühlst.



  • mhh, hätte ich gewusst, dass die ganze diskussion SO ausartet, hätte ich den thread nicht angefangen 🙄

    es geht hier NICHT um "c vs c++" sondern darum, welche funktion schneller ist.

    die antwort ist, sofern ich die beiträge, die meine frage beantwortet haben, richtig verstanden habe, strcmp.


  • Mod

    threadstarter schrieb:

    es geht hier NICHT um "c vs c++" sondern darum, welche funktion schneller ist.

    Um dieses Thema geht es in diesem Subforum immer 😃 . Warte nur, bis die ersten Java-Programmierer sich in die Diskussion einmischen…



  • SeppJ schrieb:

    threadstarter schrieb:

    es geht hier NICHT um "c vs c++" sondern darum, welche funktion schneller ist.

    Um dieses Thema geht es in diesem Subforum immer 😃 . Warte nur, bis die ersten Java-Programmierer sich in die Diskussion einmischen…

    Und wenn volkard aktiv ist irgendwie viel öfters. Eigentlich hatten wir doch schon länger keinen solchen Thread mehr.



  • --c++ schrieb:

    1. strcmp(suchbegriff,listenbegriff)
    wenn 0 -> begriff gefunden.

    Wenn du sicherstellen kannst, dass Speicherbereiche direkt nach den zu suchenden Strings von deinem Prozess lesbar sind, kannst du auch

    memcmp(s,suchstr,strlen(suchstr)+1)
    

    verwenden, das spart den für deinen Fall unnötigen lexikografischen Anteil in strcmp, evtl. spendiert dein Compiler auch einen direktne schnellen asm-Befehl(e) dafür.



  • SeppJ schrieb:

    threadstarter schrieb:

    es geht hier NICHT um "c vs c++" sondern darum, welche funktion schneller ist.

    Um dieses Thema geht es in diesem Subforum immer 😃 . Warte nur, bis die ersten Java-Programmierer sich in die Diskussion einmischen…

    C ist eine Programmiersprache von Profis für Profis. 👍
    Java ist eine Programmiersprache von Deppen für Deppen.
    C++ liegt irgendwo dazwischen.



  • Wutz schrieb:

    SeppJ schrieb:

    threadstarter schrieb:

    es geht hier NICHT um "c vs c++" sondern darum, welche funktion schneller ist.

    Um dieses Thema geht es in diesem Subforum immer 😃 . Warte nur, bis die ersten Java-Programmierer sich in die Diskussion einmischen…

    C ist eine Programmiersprache von Profis für Profis. 👍
    Java ist eine Programmiersprache von Deppen für Deppen.
    C++ liegt irgendwo dazwischen.

    Ich glaub das nicht, C und Java sind zwei Worst Case Szenarien und C++ befindet sich weit weg in eine andere Dimension - also es kann nicht dazwischen liegen 😛



  • Wutz schrieb:

    --c++ schrieb:

    1. strcmp(suchbegriff,listenbegriff)
    wenn 0 -> begriff gefunden.

    Wenn du sicherstellen kannst, dass Speicherbereiche direkt nach den zu suchenden Strings von deinem Prozess lesbar sind, kannst du auch

    memcmp(s,suchstr,strlen(suchstr)+1)
    

    verwenden, das spart den für deinen Fall unnötigen lexikografischen Anteil in strcmp, evtl. spendiert dein Compiler auch einen direktne schnellen asm-Befehl(e) dafür.

    aber da muss auch strlen aufgerufen werden.

    strcmp braucht kein strlen, also ist strcmp schneller als memcmp



  • Wutz schrieb:

    SeppJ schrieb:

    threadstarter schrieb:

    es geht hier NICHT um "c vs c++" sondern darum, welche funktion schneller ist.

    Um dieses Thema geht es in diesem Subforum immer 😃 . Warte nur, bis die ersten Java-Programmierer sich in die Diskussion einmischen…

    C ist eine Programmiersprache von Profis für Profis. 👍
    Java ist eine Programmiersprache von Deppen für Deppen.
    C++ liegt irgendwo dazwischen.

    LOL



  • C ist eine Programmiersprache von Profis für Profis. 👍
    Java ist eine Programmiersprache von Deppen für Deppen.
    C++ liegt irgendwo dazwischen.

    Aha, mal wieder ein typischer Schwanzvergleich.

    Dachte schon es ginge ums programmieren. 🙂



  • ...



  • Swordfish schrieb:

    Es liegt doch auf der Hand, das C in allen Fällen schneller sein muss!

    Das sagt ein C-Programmierer.

    Ein C++-Programmierer sagt dies und ein Java-Programmierer sagt das (sofern er genug Intelligenz besitzt, um sich klar artikulieren zu können).

    C ist eine Sprache, die von Anfang an auf Schnelligkeit entworfen wurde.
    Deshalb hat C wahrscheinlich in Tests die Nase vorn.



  • perverser schrieb:

    C ist eine Sprache, die von Anfang an auf Schnelligkeit entworfen wurde.
    Deshalb hat C wahrscheinlich in Tests die Nase vorn.

    C++ wurde als Erweiterung von C entworfen, die genauso schnell ist.
    Sämtliche C++ Konstrukte kosten nicht mehr als per Hand in C nachgebaut.


Anmelden zum Antworten