Flame aus "Projekte": C oder C++ schneller bei Spieleprogrammierung?



  • Das musst du in den anderen (mir bekannten) Sprachen auch machen und wenn dein Projekt solche Ordnerstrukturen hat dann hast du halt Pech.

    Zu c/c++ alles was c++ langsamer macht kann man in c nicht schneller machen, weil man es dort genauso lösen müsste wie in c++, nur dass man es da von Hand schreibt und nicht vom Compiler generieren lässt. Z.B. virtuelle Funktionen kann man auch in C verwenden, aber um den overhead dazu kommt man auch dort nicht herum.

    Und die C++ Streams sind nunmal langsam und wer Performance braucht der sollte halt entweder cstdio verwenden oder die OS API.



  • Das musst du in den anderen (mir bekannten) Sprachen auch machen und wenn dein Projekt solche Ordnerstrukturen hat dann hast du halt Pech.

    das ist eine richtige aussage, aber das löst das problem nicht. man kann es besser machen als in c++, also ist für mich c++ an dieser stelle nicht perfekt und bietet mir nicht all das was sich ein programmierer vorstellen kann, und das war ja schliesslich der ausgangspunkt.



  • #include "com/company/game/core/model/cplayer.h"
    

    Verwendet keiner von euch makefiles? Oder stellt in der IDE die Compileropotions um? Einfach die Includesverzeichnisse angeben und schon hat sich die Sache. Dann reicht ein simples

    #include "cplayer.h"
    

    doch vollkommen aus.



  • wie gesagt, da es nichts besseres gibt, was vergleichbar schnell ist, programmiere ich auch mit c++. ich bin auch sehr glücklich damit. wenn mich allerdings jemand fragen würde, "könnte man eine programmierumgebung schaffen, die besser ist als die heutigen c++ umgebungen", dann kann ich nur sagen ja!



  • Shade Of Mine schrieb:

    mathik schrieb:

    kann mir jemand mal an einem beispiel-code verraten, bei dem c++ langsamer als c ist, bzw. mehr speicher verbrauchen soll? die bedingung ist, dass man hierfür keine externen bibliotheken verwendet, da z.b. die iostreams von c++ ziemlich aufgepeppt sind im vergleich zu c!

    da bin ich aber gespannt... :xmas1:

    virtual dispatching VS switch

    switch kann ganz easy geinlinet werden, bei virtuellen Methoden ist das quasi nie der Fall.

    meinst du sowas hier:

    t1f(T* t) {
       //body von type1func
    }
    
    //ohne inlining
    T foo;
    switch(foo.type) {
      case T1:
         type1func(foo);
         break;
    
      ...
    
    }
    
    //jetzt geinlinet : 
    T foo;
    switch(foo.type) {
      case T1:
         //body von type1func
         break;
    
      ...
    }
    

    das lohnt sich aber auch nur, falls die funktionen, die "geinlinet" werden sollen, ziemlich klein sind. sonst wird der code zu aufgebläht, was sich dann wiederum negativ auf die performance auswirkt.

    ich habe allerdings auch gehört, das switch-case statements schneller seien können als if-then-else, da intern jump-tabellen verwendet werden können und somit dirket zum case zweig gesprungen wird. kennt einer mehr infos dazu, wie das genau funktioniert? das ist bei einfachen abfragen sicherlich einfach zu realisieren, doch was macht er wenn ich z.b. nach "1", "5", "1003", "1576" ein case habe?

    Gruß mathik



  • Einfach die Includesverzeichnisse angeben und schon hat sich die Sache. Dann reicht ein simples

    #include "cplayer.h"
    

    doch vollkommen aus.

    und was machst du wenn du viele libs von anderen firmen benutzt, die alle gleiche klassennamen haben? wie z.b "CDocument.h"? wie unterscheidet du die dann? man muss natürlich die include verzeichnisse angeben, damit der compiler die includedateien findet, aber namensräume bekommt man damit nicht in den griff. in java benutzt man solche namensräume (packages) standardmäßig, zumindest professionelle libs, und man kann auch gut damit umgehen. in c++ find ich das eher etwas umständlich.



  • rapso schrieb:

    //c++ code
    CMatrix M1,M2,M3;
    
    M1 = M2 * M3;
    
    //c code
    SMatrix
    mul(&M1,&M2,&M3);
    

    die wahrscheinlichkeit ist hoch dass hier c code schneller ist als der c++ conforme code.

    //doch was bei
    mul(&M1,&M1,&M1);
    oder
    mul(0,&M1,&M1);?
    

    rapso->greets();

    falls bei der c++ variante keine bereichüberschreitungen vorgenommen werden, was auch nicht der fall sein muss, dann kann ich mir sogar vorstellen, dass die c++ variante sogar schneller ist! denn man könnte ja auch templates für matrizen verwenden...
    Aber auch ohne templates. warum sollte die c++ version langsamer sein? wo soll deiner meinung nach die zeit verloren gehen?

    Gruß mathik



  • Langsamer dann, wenn keine Optimierungen vorgenommen werden, dh das temporäre Zwischenergebnis nicht direkt auf M1 abgebildet wird.



  • groovemaster schrieb:

    Langsamer dann, wenn keine Optimierungen vorgenommen werden, dh das temporäre Zwischenergebnis nicht direkt auf M1 abgebildet wird.

    👍
    besonders hoch ist diese wahrscheinlichkeit, wenn nicht geinlined wurde (wobei das hier ja nur BEISPIELE waren, also nicht gleich meckern;), dass man das inlinenen könnte), kann es passieren, dass der copy-constructor und die tempvar nicht wegoptimiert werden

    und naja, alles auf einen compiler zu schieben find ich suboptimal, denn ein wirklich guter compiler würde meiner meinung nach erkennen, dass ich nen bubblesort implementiert habe und ihn durch nen quicksort ersetzen.

    es ändert aber nichts daran, dass in c++ temporere objecte erstellt werden und es nichtmal ein keyword gibt um das ändern zu können und man hofft oft umsonst auf den compiler, auf der anderen seite kann man gut optimierende compiler öfter mal durch irre konstrukte dazu bringen falsche optimierungen zu machen, z.b. in einem fall in dem eine tempvar nötig wird, sie wegoptimiert wird und man ewig dran hängt den fehler herauszufinden.

    rapso->greets();



  • KXII schrieb:

    Das musst du in den anderen (mir bekannten) Sprachen auch machen und wenn dein Projekt solche Ordnerstrukturen hat dann hast du halt Pech.

    das ist eine richtige aussage, aber das löst das problem nicht. man kann es besser machen als in c++, also ist für mich c++ an dieser stelle nicht perfekt und bietet mir nicht all das was sich ein programmierer vorstellen kann, und das war ja schliesslich der ausgangspunkt.

    Und deswegen ist C++ natürlich Dreck, weil es seine Macken und Eigenheiten hat 🙄



  • rapso schrieb:

    oder überseh ich irgendwas wichtiges wie z.b. inlining von templates wodurch aufgrund der spracheigenheit das schneller werden würde?

    Exakt.
    sowohl qsort als auch std::sort nehmen einen Funktionszeiger. Nur kann man diese in C++ als einen Functor schcreiben und schon kann man es inlinen - was gerade bei sovielen Aufrufen wirklich verdammt viel ausmacht.

    idR sind daher Callbacks in C++ effektiver zu implementieren.



  • KXII schrieb:

    Das musst du in den anderen (mir bekannten) Sprachen auch machen und wenn dein Projekt solche Ordnerstrukturen hat dann hast du halt Pech.

    das ist eine richtige aussage, aber das löst das problem nicht. man kann es besser machen als in c++, also ist für mich c++ an dieser stelle nicht perfekt und bietet mir nicht all das was sich ein programmierer vorstellen kann, und das war ja schliesslich der ausgangspunkt.

    sagma, was für ein stuss schreibste da zusammen??
    C++ ist eine Programmiersprache und keine Umgebung !
    eine IDE ist eine Umgebung und was sie macht hat doch überhaupt nichts mit der Sprache zu tun.
    Wenn du mit deiner Entwicklungsumgebung nicht zufrieden bist, kann doch C++ nix dafür. Ein Text-Editor und der C++Compiler, das ist die einfachste Umgebung in der du Programme schreiben kannst. ist jetzt C++ daran Schuld das du alles von Hand machen musst ?
    Was du dir wünschst ist eine bessere IDE für C++ und nicht ein besseres C++.



  • und den compiler schon wärend des editierens compilieren lässt, soweit er das kann

    dass das niemand macht, heisst nicht, dass der standard das verbietet. C++ ist eine sprache, die implementierung der sprache ind en einzelnen compilern ist absolut egal.

    in java benutzt man solche namensräume (packages) standardmäßig

    was das namensproblem aber auch nur auf eine andere ebene verschiebt, es ist schon immernoch vorhanden. Gegenbeispiel: was ist, wenn 2 libs die selben packagenamen haben? wie willst du dann noch damit zurande kommen?



  • rapso schrieb:

    und naja, alles auf einen compiler zu schieben find ich suboptimal, denn ein wirklich guter compiler würde meiner meinung nach erkennen, dass ich nen bubblesort implementiert habe und ihn durch nen quicksort ersetzen.

    das sind genau solche sachen, die ein compiler niemals optimieren können wird!

    rapso schrieb:

    es ändert aber nichts daran, dass in c++ temporere objecte erstellt werden und es nichtmal ein keyword gibt um das ändern zu können und man hofft oft umsonst auf den compiler, auf der anderen seite kann man gut optimierende compiler öfter mal durch irre konstrukte dazu bringen falsche optimierungen zu machen, z.b. in einem fall in dem eine tempvar nötig wird, sie wegoptimiert wird und man ewig dran hängt den fehler herauszufinden.

    rapso->greets();

    was spricht gegen objektorientierung, dem typen Matrix eine operation zu verpassen, die zwei matrizen als parameter bekommt, wenn es bei der multiplikation von 3 matrizen tatsächlich einen ausgeklügelteren algorithmus gibt, und dieser auch häufig verwendet wird?

    worum es mir geht:
    es ist falsch zu sagen, dass mit der OOP programme langsammer werden! Ich würde sogar behaupten, dass bei großen projekten diese sogar schneller und stabiler sind, da man aufgrund der höheren übersichtlichkeit besser optimieren kann. es liegt am programmierer oder am schlechten entwurf, falls das nicht der fall sein sollte. und an einem evtl. schlechten compiler... :xmas1:

    Gruß mathik



  • KXII schrieb:

    damit meine ich, daß man alles hinschreiben muss, und der compiler/linker/ide nichts für einen verwaltet, wie z.b. die includes im stile:

    #include "com/company/game/core/model/cplayer.h"
    

    sowas sollte man nicht mehr hinschreiben müssen, sondern die ide sollte das für einen verwalten. da aber in c++ "#include's" ein teil der sprache sind (es gehört zum präprozessor, der aber auch zu c/c++ gehört) ist das nicht wirklich möglich.

    Warum sollte es nicht möglich sein eine Compiler IDE zu schreiben, bei der man sowas per Mausklicks einstellen kann? Ausserdem wäre es Schwachsinn #include's aus dem Standard zu entfernen (ist das wirklich deine Meinung oder n Missverständniss?); wie sollte man dann sowas machen können?

    #if defined BLUBB
      #include "cplayer.h"
    #else
      #include "neanderedatei.h"
    #endif
    

    Sowas kann dir ne IDE nich (oder nur schwer) abnehmen.



  • otze schrieb:

    was das namensproblem aber auch nur auf eine andere ebene verschiebt, es ist schon immernoch vorhanden. Gegenbeispiel: was ist, wenn 2 libs die selben packagenamen haben? wie willst du dann noch damit zurande kommen?

    Nein, wenn man sich wirklich an die Java-Konventionen hält, würde das so aussehen:

    net.emuleproject.gui
    net.emuleproject.chat
    ...

    und du wirst mir sicher nicht ernsthaft erzählen wollen, dass du mal aus Versehen deine GUI-Lib mal so nennen würdest. Das ist allerdings nicht irgendeine tolle Besonderheit der Sprache Java, die C++ nicht hat, als viel mehr eine Sache dessen, dass im Allgemeinen Java-Programmierer das anders handhaben und diese Vorgehensweise noch ein bisschen gefördert wird.
    Beispielsweise wird das anonyme package (der "globale namespace") praktisch nie benutzt, weil es auch noch mit sprachlichen Einschränkungen daherkommt. In Java gibt es keinen Scope-Auflösungsoperator '::' und man kann von einem nicht-anonymen package aus nicht auf Elemente des anonymen packages zugreifen.



  • Ich seh das genauso wie rapso! Genau so was hab ich gemeint! und gerade bei na Matrix kann man sich überlegen ob die C Variante net gscheiter ist!

    Niemand greift die OPP variante an! Ich find das super und verwend wie schon hundert mal gesagt auch gerne klassen, aber halt nur wenns wirklich in eine gehört (meiner Meinung nach) und wenn es zur übersichtlichkeit gut beiträgt! Dann nhm ich auch die Nachteile in Kauf. Nur z.b. ne Klasse für nen Vector würd ich wahrscheinlich ned machen. Wenn ich eh noch viele übergeordnete klassen hab würd ich da eher ne typedef struct machen so aus dem gefühl heraus. Denn hier trägt eine Klasse wirklich nur minimal zu einer großen verbesserung bei. (Wobei das bei dem Beispiel auch von dem code her keinen wirklichen unterschied machen würd, is eher ne geschmackssache)

    Also: Wie finden alle oop super 😃 und verwenden die auch gerne, ich wollte nur auf mögliche Probleme hinweisen. (und eigentlich ein Team machen; aber dank den Moderatoren ist das jetzt eh ein neuer Thread!; Danke nochmal 😉 )

    cu Manuelh87



  • Wie wäre es mal, wenn man eine Aufgabe erstellt, die von C Programmieren als auch C++ Programmierern lösen lässt.
    Logischerweise gleiche Aufgabebedingungen und ein 'kleines Benchmark' sollten enthalten sein.

    Denn können wir mal Vergleiche ziehen, welche Version schneller ist.



  • das ergebnis wird da dann wohl am Compiler liegen...



  • Das kommt zu stark auf die technik und die skills des coders an und ich weiß nicht was du damit beweisen willst und wem du das beweisen willst?
    Ich mein für mich is klar das ma mit nem guten c-compiler aufjedenfall ne kleinere datei zamkriegt aber auch das ist stark abhängig von den verwendeten Biliotheken.

    Ich fänds besser ein richtiges Projekt zu haben :xmas1: (so wie meins zb wo sich noch keiner gemeldet hat.... 😃 )

    cu Manuelh87 :xmas1:


Anmelden zum Antworten