Welche Funktion ist schneller: strcmp oder strlen?



  • knivil schrieb:

    also die Parameter nicht willkürlich begrenzt

    Die Groesse des lokalen Arrays muss beschreankt sein, hier ist es auf 255 Eintraege beschraenkt. Nicht durch die Funktion selbst aber durch & 0xFF beim Parameter. D.h. ein lokales Array mit max 256 Eintraegen tut es auch.

    Ok.

    #include <stdio.h> 
    #include <string.h> 
    
    int f(int n) { 
      register int i, j, cnt; 
      char nonprime[n];
      memset(nonprime, 0, n); 
    
      for (i=2; i<n; ++i) 
        if (!nonprime[i]) 
          for (j=2; i*j<n; ++j) 
            nonprime[i*j]=1; 
    
      cnt = 0; 
      for (i=2; i<n; ++i) 
        cnt += !nonprime[i]; 
      return cnt; 
    } 
    
    int main() { 
      register int i, sum=0; 
      for (i=0; i<LOOPS; ++i) 
        sum += f(i&0xFF + ((i==0)<<16)); 
      printf("%d\n", sum); 
      return 0; 
    }
    
    #include <vector> 
    #include <iostream> 
    
    int f(int n) { 
      char nonprime[1<<16]={};
      //std::vector<char> nonprime(n);
      for (int i=2; i<n; ++i) 
        if (!nonprime[i]) 
          for (int j=2; i*j<n; ++j) 
            nonprime[i*j]=true; 
    
      int cnt = 0; 
      for (int i=2; i<n; ++i) 
        cnt += !nonprime[i]; 
      return cnt; 
    } 
    
    int main() { 
      int sum=0; 
      for (int i=0; i<LOOPS; ++i) 
        sum += f(i&0xFF + ((i==0)<<16)); 
      std::cout << sum << '\n'; 
      return 0; 
    }
    

    C 0m0.811s
    C++ 0m4.801s

    Ethon schrieb:

    Der meiste C-Code geht ineffizienter mit Heapspeicher um, da auch in C sehr viel auf dem Heap angelegt wird, aber der meiste code nicht an die hochoptimierten C++-Klassen wie std::string herankommt (mit SSO etc).

    Willst du es drauf ankommen lassen? VLA ist viel mächtiger als SSO und hat weniger Overhead.
    Zeig du mir C++-Code mit Strings und ich bau dir einen schnelleren C-Code.
    Nur nicht kompliziertere Sachen wie Sortieren und Hashen, darauf habe ich gerade keine Lust.



  • objdump schrieb:

    Ethon schrieb:

    Der meiste C-Code geht ineffizienter mit Heapspeicher um, da auch in C sehr viel auf dem Heap angelegt wird, aber der meiste code nicht an die hochoptimierten C++-Klassen wie std::string herankommt (mit SSO etc).

    Willst du es drauf ankommen lassen? VLA ist viel mächtiger als SSO und hat weniger Overhead.
    Zeig du mir C++-Code mit Strings und ich bau dir einen schnelleren C-Code.
    Nur nicht kompliziertere Sachen wie Sortieren und Hashen, darauf habe ich gerade keine Lust.

    VLAs haben ein sehr begrenztes Einsatzgebiet, nämlich nur für funktionslokale Arrays. Strings werden aber in der Regel herumgereicht und da werden sie in C selbstverständlich mit malloc angelegt.

    objdump schrieb:

    C 0m0.811s
    C++ 0m4.801s

    Süßer Versuch den C++ Code das ganze Array nullen zu lassen und nicht nur n Bytes.
    Ändere das ab und beide sind exakt gleichschnell.


  • Mod

    objdump schrieb:

    Zeig du mir C++-Code mit Strings und ich bau dir einen schnelleren C-Code.

    int main()
    {
     string str;
     getline(str, cin);
     cout << str << '\n';
    }
    

    Wenn dein C-Programm durch die Benutzereingabe abstürzt* oder sonstwie undefiniertes Verhalten oder Speicherlöcher oder anderes Verhalten als die C++-Lösung (ich kann Nullzeichen und Umlaute eingeben!) zeigt, dann ist es nicht gleichwertig. Du darfst dich in ein paar Stunden melden, wenn du die gleichschnelle C-Alternative zu diesen in 5 Sekunden getippten Zeilen fertig gestellt hast.

    *: Ich bin mal so fair, eine maximale Eingabelänge von 8 GB vorzugeben.



  • objdump schrieb:

    char nonprime[1<<16]={};
    

    Das ist doch Unfug. Mit allerbilligsten Tricks versuchst Du C++ zu verunglimpfen.
    Hier soll der extrem dumme C++-Programmierer nicht memset oder sowas nehmen. Warum?



  • SeppJ schrieb:

    Du darfst dich in ein paar Stunden melden, wenn du die gleichschnelle C-Alternative zu diesen in 5 Sekunden getippten Zeilen fertig gestellt hast.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      char *line = NULL;
      size_t len = 0;
      while (getline(&line, &len, stdin) != -1)
        printf("%s", line);
      free(line);
      return 0;
    }
    

    C 0m0.457s
    C++ 1.675s

    Wenn ich die C++-Variante optimiere, komme ich auf ähnliche Ergebnisse wie für C.





  • Also der C++-Code dazu ist

    int main() 
    {
      std::string str; 
      while (std::getline(std::cin, str)) {
        std::cout << str << '\n';
      }
    }
    


  • SeppJ schrieb:

    Wenn dein C-Programm durch die Benutzereingabe abstürzt* oder sonstwie undefiniertes Verhalten oder Speicherlöcher oder anderes Verhalten als die C++-Lösung (ich kann Nullzeichen und Umlaute eingeben!) zeigt, dann ist es nicht gleichwertig. Du darfst dich in ein paar Stunden melden, wenn du die gleichschnelle C-Alternative zu diesen in 5 Sekunden getippten Zeilen fertig gestellt hast.

    Stimmt... Benutzereingaben sind absolut performancerelevant... 🙄



  • -- Hier stand Unsinn --



  • objdump schrieb:

    SeppJ schrieb:

    Du darfst dich in ein paar Stunden melden, wenn du die gleichschnelle C-Alternative zu diesen in 5 Sekunden getippten Zeilen fertig gestellt hast.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      char *line = NULL;
      size_t len = 0;
      while (getline(&line, &len, stdin) != -1)
        printf("%s", line);
      free(line);
      return 0;
    }
    

    C 0m0.457s
    C++ 1.675s

    Wenn ich die C++-Variante optimiere, komme ich auf ähnliche Ergebnisse wie für C.

    Lass mich raten:
    Bei C hast du gleich auf Enter gedrückt
    Bei C++ hast du paar Buchstaben gedrückt

    🤡 🤡 🤡



  • Mir ist absolut schleierhaft, wie man auf die Idee kommen kann, Performancemessungen mit Benutzereingaben zu machen....

    Die ganze Diskussion scheint mir mal wieder sehr stark auf Basis von Emotionen anstatt von Fakten zu laufen. Und es sind mal wieder auf beiden Seiten Fanatiker unterwegs, die den Gebrauch des jeweils anderen Werkzeugs verteufeln.
    Ziemlich armselig.


  • Mod

    Das ist gar kein C, auch kein C11. Außerdem macht deine C-Version andere Ausgaben als die C++-Version*. Setzen, 6.

    Wenn du was portables und funktionierendes gefrickelt hast, melde dich noch einmal zur Nachprüfung.

    *: Ist schon toll, wie ich sogar in meiner Herausforderung explizit erwähne, worauf zu achten ist, und du trotzdem darauf rein fällst.



  • Jetzt mal ernsthaft: Die ganze Diskussion ist für den Arsch. Performance-Hotspots schreibt man natürlich nicht mit aufgestyltem Code, der x mal Speicher vom Heap holt. Da wird C++-Code natürlich mit einem C-ähnlichem Subset geschrieben. Oder in Assembler, sollte mit Skill schneller sein als C. Oder man schickt es gleich auf dem GPU und lässt da rechnen.

    Es geht schlicht darum dass einige Sprachmechanismen in C++ wie Templates optimalen Code erzeugen, den man in C auch schreiben könnte - aber häufig mit erheblichem Mehraufwand seitens des Programmierers.


  • Mod

    Ethon schrieb:

    Jetzt mal ernsthaft: Die ganze Diskussion ist für den Arsch. Performance-Hotspots schreibt man natürlich nicht mit aufgestyltem Code, der x mal Speicher vom Heap holt. Da wird C++-Code natürlich mit einem C-ähnlichem Subset geschrieben. Oder in Assembler, sollte mit Skill schneller sein als C.

    Nee, die Zeiten sind lange vorbei. Besonders der Assembler, außer du hast richtig viel Manpower zur Verfügung oder kennst ganz spezielle Nebenbedingungen über das Anwendungsgebiet oder den Prozessor, die der Compiler nicht kennen kann.

    Ich kann dir das tolle Primzahlenbeispiel in idiomatischem C++ schreiben, sogar mit vector<bool>, da kannst du in absehbarer Zeit mit C höchstens gleichziehen und in Assembler wirst du höchstwahrscheinlich auch nicht dran vorbeikommen (oder wenn doch, wirst du ziemlich lange dafür brauchen).

    Mit der GPU oder OpenMP wirst du natürlich auf einfache Weise schneller, da das Sieb halbwegs gut parallelisierbar ist. Aber diese Techniken sind unabhängig von der Sprache.



  • SeppJ schrieb:

    Ich kann dir das tolle Primzahlenbeispiel in idiomatischem C++ schreiben, sogar mit vector<bool>, da kannst du in absehbarer Zeit mit C höchstens gleichziehen und in Assembler wirst du höchstwahrscheinlich auch nicht dran vorbeikommen (oder wenn doch, wirst du ziemlich lange dafür brauchen).

    Mach doch mal...



  • SeppJ schrieb:

    Ich kann dir das tolle Primzahlenbeispiel in idiomatischem C++ schreiben,

    idiomatisch? meinste kanonisch?
    Daß Du beim Programmieren irgendwelche Idiome verwenden wirst, ist eh klar.
    Was ist nicht-idiomatisches C++?



  • er hat sich vertippt und meint: idiotisch 💡



  • Mach doch mal. Es gibt sicher den einen oder anderen C-Experten, der die Herausforderung gern annimmt 😉



  • volkard schrieb:

    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.

    Ja, ohne Vergleich geht es nicht.
    Wer hindert einen daran, einen solchen Algorithmus in C zu implementieren? Einen Algo der mindestens so effizient/schnell arbeitet wie der in C++?
    Oder sogar einen schnelleren?



  • Wer hindert einen daran, einen solchen Algorithmus in C zu implementieren?

    Niemand hindert einen, gleiches gilt fuer Assembler oder gleich Binary. But what 's the point?


Anmelden zum Antworten