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



  • Talla schrieb:

    Bin selber im Embeddedbereich tätig und bei uns richtet sich die Wahl ob C oder C++ nur nach dem verfügbaren Speicher und nicht nach der Geschwindigkeit der Sprachen weil die im Prinzip nicht viel differieren, im Speicherverbrauch schon und es geht bei uns um µS, also schnell sind wirklich beide Sprachen. Und nie versuchen den Kompiler mit Optimierungen zu überlisten! Moderne Kompiler sind wirklich stark in Sachen Optimierungen: Vor allem was Datenzugriffe angeht, Alignment, Arrays(2 Dimensionale werden zum Beispiel zu Eindimensionalen gemacht wenn die erste Dimension 1 beträgt usw.), Funktionsaufrufen und Vereinfachungen zu tun hat. Es ist wirklich erstaunlich und hätt ich den Assemblercode nicht selber gesehen hätt ich davon auch nur die Hälfte geglaubt.

    Tja nur ist mir halt auch portablität wichtig und mein lcc checkt das wahrscheinlich ned so genau. Ihr habts da sicher bestimmte Optimierungen.

    Und was meinst mit den Kompiler mit optimierungen zu überlisten? Meinst du damit den Code selbst optimieren (durch asm oder so) oder was?

    Das mit dem Speicherplatz kenn ich vom Tiv200. da is das auch ne rarität nur kann der compiler keine so tollen optimierungen das ich einfach drauflos coden könnt; da muss ich schon die effectivität im Auge behalten...

    Ist der Assemblercode von euerm system echt so gut wie von einem Assembler geschrieben? Das wär allerdings beeindruckend!
    Andererseits schaust du dir ja die assem.codes an; dass wirst ja ned ohne grund machen...

    Richtig eingesetzt ist c++ natürlich gleichschnell wie C oder vielleicht sogar besser? aber ihr werdet sicher bestätigen das ein schlechter Gebrauch von Klassen für den Code, gerade in eurem Bereich, tödlich ist! oder?

    Manuelh87



  • EnERgYzEr schrieb:

    Nicht alles was John Carmack sagt, ist Gesetz 🙄.

    Ist diese Aussage:

    ??

    Wer weiß es?!?! :xmas1: 👍



  • Manuelh87 schrieb:

    Tja nur ist mir halt auch portablität wichtig und mein lcc checkt das wahrscheinlich ned so genau. Ihr habts da sicher bestimmte Optimierungen.

    Also bei uns bedeutet Portabilität eigentlich nur keine Standardtypen zu verwenden, sondern neue eigene definierte und bei den Funktionen auf eine Generizität zu achten, dass man nicht für einen Controller optimiert.
    Der Rest der Portierung übernimmt der Compieler, bzw. die Compiler, da du für so ziemlich jede Plattform nen anderen Compiler hast.

    Manuelh87 schrieb:

    Und was meinst mit den Kompiler mit optimierungen zu überlisten? Meinst du damit den Code selbst optimieren (durch asm oder so) oder was?

    Nein, wenn man anfängt sich zu Fragen wie der Compiler das und das Optimieren könnte und es so hinbaut wie man denkt das er es am besten kompiliert, hat man schon fast verloren! Die sind echt so geschrieben das die Code von alleine optimieren.

    Manuelh87 schrieb:

    Das mit dem Speicherplatz kenn ich vom Tiv200. da is das auch ne rarität nur kann der compiler keine so tollen optimierungen das ich einfach drauflos coden könnt; da muss ich schon die effectivität im Auge behalten...

    Tiv200 sagt mir absolut nichts 😕 Habe zum Beispiel grad am Infineon Tricore 1796 zu schaffen und benutzen nen Compiler von Tasking und der kostet alleine schon mehr als viele für nen "einfachen" Compiler ausgeben würden. 🙂
    Aber der Compiler ist auch wirklich auf den Prozessor zugeschnitten und kennt alle Macken und Vorteile.

    Manuelh87 schrieb:

    Ist der Assemblercode von euerm system echt so gut wie von einem Assembler geschrieben? Das wär allerdings beeindruckend!
    Andererseits schaust du dir ja die assem.codes an; dass wirst ja ned ohne grund machen...

    Blind vertrauen darf man auch nicht, in unserem Fall war es zum Beispiel die Optimierung von Arrays, weil bei einer Dimension wird intern über Basisadresse und Offset gearbeitet, bei 2 Dimensionalen muss dann intern multipliziert werden und das kostet Performance(Wie gesagt, alles bezogen auf embedded, bei normalen Pc Programmen kann man das normal vernachlässigen)
    Und das haben wir uns einfach mal angeguckt 🙂
    Man kann viel Optimieren wenn man wirklich versucht einfache Operationen zu verwenden. Ne Multiplikation ist immer langsamer als ne Addition und da muss man wirklich auf jeden Codeteil gucken und schauen das man den schon optimal designt, und dann optimiert der Compiler ( Bei dem oben genannten wird übrigens erst der C Code Optimiert, dann in ASM übersetzt, der wird von Assembler nochmal optimiert und daraus erstellt er Maschienencode) den Rest. Auch durch den Linker kann man optimieren.

    Manuelh87 schrieb:

    Richtig eingesetzt ist c++ natürlich gleichschnell wie C oder vielleicht sogar besser? aber ihr werdet sicher bestätigen das ein schlechter Gebrauch von Klassen für den Code, gerade in eurem Bereich, tödlich ist! oder?

    Jaja, man muss schon aufpassen was man macht, Aber es liegt wirklich mehr an den Algorithmen! Da sind Fragen wie breit die Speicheranbindung ist, wievielbittig ist der Controller usw. viel wichtiger als die Sprache.
    Talla



  • Sgt. Nukem schrieb:

    EnERgYzEr schrieb:

    Nicht alles was John Carmack sagt, ist Gesetz 🙄.

    Ist diese Aussage:

    😃

    Hab ich nen Telefonjoker? 👍

    :xmas2: :xmas1:



  • Hallo leute,

    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:

    Gruß mathik



  • Manuelh87 schrieb:

    Ich denke und da wird mir diesmal hoffentlich jeder zustimmen das C++ einfach ne saugeile sprache ist und echt alles kann was sich der Programmierer nur vorstellen kann.
    (Und das gilt auch für C , klar ned!)
    Ich denke mit diesem Schlusssatz kann jeder leben, aber ich bin offen für Kritik!

    LOL! c++ ist dreck! rein vom sprachsystem her und den ide's die es heute gibt, ist das alles dreck. nur leider gibt es nichts besseres, und daher muss ich das nehmen was es gibt. aber das ist ein anderes thema.

    Manuelh87 schrieb:

    ein schlechter Gebrauch von Klassen

    😕. wasn konstrukt.



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



  • //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);?
    

    also c++ konform zu schreiben hat schon seine nachteile was performance angehet, dafür steigt die sicherheit.
    das gleiche gilt für java<->c++, in java bekommt man gleich ne exception wenn man über ein array schreibt (gut, in c++ sollte man auch eher nen vector benutzen, aber wer benutzt schon .at()??) natürlich muss dafür in java bei jedem arrayzugriff die boundery geprüft werden.

    btw. das ist kein flame, man sollte sich schon im klaren sein, dass c++ ein wenig langsammer sein kann, aber manchmal kommt es auch auf die zeit an die man braucht um code zu schreiben, und wenn sprachen einem die möglichkeit bieten sowohl sicher zu coden, wie auch performanten code zu schreiben, sollte man erstmal auf sicherheit setzen und falls man fertig ist, erst dann lässt man einen profiler über den code laufen und optimiert die paar stellen.

    my2c?nt

    rapso->greets();



  • KXII schrieb:

    LOL! c++ ist dreck! rein vom sprachsystem her und den ide's die es heute gibt, ist das alles dreck. nur leider gibt es nichts besseres, und daher muss ich das nehmen was es gibt. aber das ist ein anderes thema.

    Du bringst mein Weltbild durcheinander :xmas2: Wo ist den C++ dreck ? *durcheinander*

    Ich bin noch lange nicht das was man einen "guten Programmieren der ein erfahrenden " nennen kann aber bist jetzt was ich mir C++ gemacht habe hat mich nicht enttäuscht. Aber wie gesagt ich bin noch lange nicht an den genzen der Sprach was heiß grenzen von 100% kann ich grade mal "10.

    Na ja obwohl es nen anderes Thema, hätte ich gerne von dir eine kleine Stellungnahme. Wenn nicht hier im Forum als Beitrag dann von mir aus als Nachricht in forum oder per Mail oder was auch immer :xmas1:

    Happy X-mas

    |23|

    Ps. Das Schönste an x-mas ist doch der Urlaube (wenn man den noch welchen hat) 😉



  • rapso schrieb:

    also c++ konform zu schreiben hat schon seine nachteile was performance angehet, dafür steigt die sicherheit.

    Nicht zwangsläufig.
    Denn mit mojo kann man deinen C++ Code deutlich verschnellern, falls der Compiler keine NRVO kann.

    Und als kleines Gegenbeispiel, dass C langsamer ist als C++:
    std::sort VS qsort



  • Was ist "mojo"?



  • Shade Of Mine schrieb:

    Und als kleines Gegenbeispiel, dass C langsamer ist als C++:
    std::sort VS qsort

    das ist keine spracheigenheit, sondern eine lib mit nem besseren algorithmus, wie die intern ablaufen und was schneller ist, das hängt von internen implementationen ab, gibt bestimmt auch implementierungen bei denen std::sort langsammer als qsort anderer implementierungen ist.

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

    rapso->greets();

    btw: mojo



  • das C++ einfach ne saugeile sprache ist und echt alles kann was sich der Programmierer nur vorstellen kann.

    ich kann mir dinge vorstellen die es in c/c++ gar nicht gibt. vorallem gibt es sachen die nur schlecht umgesetzt wurden. für meinen geschmack muss man viel zu viel hinschreiben. besserer wäre es, wenn der compiler den code analysiert und sich um alles kümmert.

    zum beispiel includes (von sehr langen dateiangaben mit namesräumen, könnte man durch ein paar mausklicks ersetzen), bedingte includierung und vorwärtsdeklarationen von klassen sind vollkommen unnötig. benannten breaks bzw. elses gibt es überhaupt nicht (schleifen und ifs mit namen, so das man in einer 5fachverschachtelten schleife sagen kann "break schleife 3", das gleiche für ifs; ein "else bedingung5" wäre sehr hildreich, damit man nicht alles durch klammern deutlich machen muss.) auch bei den ides kann man verbessern. für mich gehört zu einer programmiersprache auch die umgebung in der man sie nutzt (siehe visual basic). da c++ rein textbasiert ist und kein programm alles verwaltet ergeben sich nachteile für die ide. es gibt noch andere beispiele, aber die müsste ich genau erklären, dazu habe ich aber keine lust. man kann c++ auf jeden fall verbessern und das was es heute gibt, ist für die heutige (moderne) zeit lächerlich und somit dreck.

    aber bist jetzt was ich mir c++ gemacht habe hat mich nicht enttäuscht.

    es kommt nicht darauf an, was man mit c/c++ alles machen kann, sondern wie man es macht, denn man kann mit c/c++ alles machen was man will. (bestimmt hast du es anders gemeint 🙂 früher hat es mich auch nicht entäuscht, das kam erst nach und nach, als ich größere sachen in c/c++ und auch java geschrieben habe und mir aufgefallen ist, das man das auch besser machen kann.



  • da c++ rein textbasiert ist und kein programm alles verwaltet ergeben sich nachteile für die ide.

    Häh? Kannst du das bitte genauer ausführen? Welche Programmiersprache ist nicht "textbasiert"?
    Nur weil du für VB nen schönen GUI-Editor hast, ist sie genauso textbasiert und du kannst dir bei VB.Net auch den vom GUI-Designer generierten Code ansehen...



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

    #unclude "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. klar man kann jetzt darüber schreiten, ob das wirklich bestandteil der sprache ist oder nicht, für mich ist es das aber. in visual basic z.b. muss ich das nicht hinschreiben, ich klick es einfach an, und gut ist. ich sehe auch weiter nichts mehr davon im quelltext.

    prinzipiell sollte man nur den code hinschreiben müssen und den ganzen kram drum herum weglassen können. wie z.b auch das man definition und implementierung von klassen getrennt in 2 dateien angeben "muss", damit der code schnell kompiliert werden kann, ist auch überflüssig. mach das mal in c++ in nur einer datei. wenn eine ide das für einen verwaltet würde, dann geht das schon eher, aber dann verändert man ja die philosphie der sprache und somit auch die sprache ansich.

    da alles textbasiert ist, muss auch immer alles auf einmal compiliert werden. viel besser wäre es, wenn man den kompletten code in teilstücke zerlegen würde (soweit das geht) und den compiler schon wärend des editierens compilieren lässt, soweit er das kann (siehe eclipse). das würde bestimmt die entwicklung beschleunigen. wegen 100% textbasierung ist das nur sehr schwer wenn nicht gar unmöglich. (oder warum gibt es keine bekannte ide die sowas kann?)



  • 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


Anmelden zum Antworten