C++-Quellcode in Asm-Code konvertieren?



  • Hi,
    Also Assembler ist ja superschnell usw.
    Wäre es theoretisch möglich ein Programm zu bastelt, welches C++-Quellcode in Assemblerquellcode umwandelt, um entsprechend Performance rauszuholen?

    Danke und Tschö



  • lol

    du hast ja überhaupt keine ahnung



  • Das hilft dir leider garnichts. Denn ein Compiler produziert imemr erst Assembler bevor er das fertige erstellt. Mit Geschwindigkeit hat da snichts zu tun. Wenn dich der Code intressiert, beim gcc heißt der Schalter -S, beim MSVC weiß ichs nicht mehr, einfach Hilfe lesen 🙂 Die Compiler lassen dannd ie temporären Assembler-Files am leben bzw. hören an dem Punkt auf zu arbeiten. Aber das was du dir erhoffst tritt definitiv nicht ein.



  • Hmm, aber warum ist dass dann langsamer als Assemblercode?
    Bzw. wenn das nicht der Fall ist, wozu ist dann Assembler gut?



  • naja, ich wuerde mal sagen im assemblercode ist nicht soviel "drin".
    wenn du ein c/c++ programm uebersetzt wird in jedem fall noch eine
    menge an zeugs (laufzeitumgebung) mit hinzugebunden.



  • Falky schrieb:

    Hmm, aber warum ist dass dann langsamer als Assemblercode?
    Bzw. wenn das nicht der Fall ist, wozu ist dann Assembler gut?

    Was der Compiler generiert ist ein automatisch generierter Code. Er versucht den C-Code nach eigenem Gewissen so gut wie möglich zu bauen. Oft kann er das besser als ein Mensch der ASM-Code dazu schreibt. Manchmal kennt man aber Gegebenheiten und Tricks die der Compiler nicht kennt. Insbesondere Interessant, wenn der Compiler Dinge wie MMX und SSE nicht selber benutzen mag. In Spezialfällen kann man also Muster erzeugen auf die der Compiler quasi nicht kommt. Und die können dann schneller sein. Deswegen nutzt man Assembler auch neben Betriebssystemprogrammierung (es gibt Dinge die haben in C so kein Äquivalent) nur an sehr wenigen kritischen Stelllen, wos was bringt.



  • entelechie schrieb:

    wenn du ein c/c++ programm uebersetzt wird in jedem fall noch eine menge an zeugs (laufzeitumgebung) mit hinzugebunden.

    C++ ist nicht Java, ich schätze Du meinst libc und Konsorten, oder?



  • jo.



  • Du kannst aber Teile deines Programmms direkt in Asm schreiben, dann wirds schneller



  • ich wette, dass ich in Assembler genauso langsame programme schreiben kann, wie andere in C++ 😉 nur Assembler allein macht's nicht



  • davie schrieb:

    ich wette, dass ich in Assembler genauso langsame programme schreiben kann, wie andere in C++ 😉 nur Assembler allein macht's nicht

    ich kann dir auch ein programm schreiben, was fünf minuten braucht um 1+1 zu rechnen (ohne Wartefunktion). Natürlich musst du wissen was du tust, aber gemäß dem Fall du kannst Asm, kannst du so deine Programme beschleunigen



  • ManDrake14 schrieb:

    ich kann dir auch ein programm schreiben, was fünf minuten braucht um 1+1 zu rechnen (ohne Wartefunktion.)

    Das schreit nach einem Beisspielcode.
    5 Minuten wäre eine echte Leistung ohne Wartefunktionen.



  • Jover schrieb:

    ManDrake14 schrieb:

    ich kann dir auch ein programm schreiben, was fünf minuten braucht um 1+1 zu rechnen (ohne Wartefunktion.)

    Das schreit nach einem Beisspielcode.
    5 Minuten wäre eine echte Leistung ohne Wartefunktionen.

    Das ist doch mal ein Wort 😃



  • Find ich interessant, auch mal in die andere Richtung zu optimieren...
    Mein Programm braucht 8' 37'' auf nem Athlon XP 1800+, ohne Wartefunktionen.
    😃 😃 😃

    #include <iostream>
    #define grosse_zahl unsigned long
    #define zahl int
    #define ist =
    #define ist_gleich ==
    #define groesser >
    #define groesser_gleich >=
    #define plus +
    #define minus -
    #define null 0
    #define eins 1
    #define zwei 2
    #define und ,
    #define solange while
    #define tu_das_was_zwischen_den_geschweiften_klammern_steht_solange_die_bedingung_zwischen_den_beiden_strichpunkten_in_der_klammer_wahr_ist_und_mache_in_jedem_durchgang_das_was_hinter_dem_letzten_strichpunkt_steht_vergiss_aber_bitte_nicht_zuerst_die_initialisierung_vor_dem_ersten_strichpunkt_auszufuehren for
    #define rueckgabe return
    #define ist_nicht !=
    #define subtrahiere_eins_von --
    #define addiere_eins_zu ++
    #define blockanfang {
    #define blockende }
    #define klammer_auf (
    #define klammer_zu )
    #define irgendwas 42
    #define irgendwas_anderes 424242
    #define schreibe_hin(a, b) std::cout << a << b << std::endl
    #define ja ?
    #define nein :
    
    grosse_zahl multipliziere klammer_auf grosse_zahl a und grosse_zahl b klammer_zu
    blockanfang
    	grosse_zahl resultat ist null;
    	solange klammer_auf b groesser null klammer_zu
    	blockanfang
    		resultat ist resultat plus a;
    		subtrahiere_eins_von b;
    	blockende
    	rueckgabe resultat;
    blockende
    
    grosse_zahl teile klammer_auf grosse_zahl a und grosse_zahl b klammer_zu
    blockanfang
    	grosse_zahl m ist null, r ist a;
    	solange klammer_auf r groesser_gleich b klammer_zu
    	blockanfang
    		r ist r minus b;
    		addiere_eins_zu m;
    	blockende
    	rueckgabe m;
    blockende
    
    zahl main klammer_auf klammer_zu
    blockanfang
    	grosse_zahl resultat;
    	tu_das_was_zwischen_den_geschweiften_klammern_steht_solange_die_bedingung_zwischen_den_beiden_strichpunkten_in_der_klammer_wahr_ist_und_mache_in_jedem_durchgang_das_was_hinter_dem_letzten_strichpunkt_steht_vergiss_aber_bitte_nicht_zuerst_die_initialisierung_vor_dem_ersten_strichpunkt_auszufuehren  klammer_auf resultat ist irgendwas_anderes; resultat ist_nicht eins plus eins; subtrahiere_eins_von resultat klammer_zu
    	blockanfang
    		resultat ist multipliziere klammer_auf resultat und irgendwas klammer_zu;
    
    		resultat ist teile klammer_auf resultat und irgendwas klammer_zu;
    	blockende
    	schreibe_hin ( "eins plus eins ist " , klammer_auf resultat ist_gleich zwei ja "zwei" nein "hmmm" klammer_zu );
    blockende
    

    Gute Nacht...



  • Stichpunkt C++-Code in schnelleren ASM-Code umwandeln: Man koennte sich ja auch von seinem Compiler den Assemblercode seines Programms ausgeben lassen und den zum Fruehstueck von Hand optimieren 😉
    Oder man aktiviert in seinem Compiler Codeoptimierungen ...



  • lol @palm 😃

    das nen ich nen sauberen und uebersichtlichen programmierstil!



  • Erinnert mich nur irgendwie an Pascal 😞 :D. C++ (ohne die defines) lässt sich besser lesen :).



  • palm-man schrieb:

    Erinnert mich nur irgendwie an Pascal 😞 :D. C++ (ohne die defines) lässt sich besser lesen :).

    😃 Pascal is doch von Natur aus so langsam, da brauchst du hoechstens 1/10 des Codes aus palms Beispiel 😉 😃



  • He da 🙂
    All die Leute die immer erzählen asm sei "fast nie" besser als C/++-code.
    habt ihr das mal ernster probiert?
    Klar ein neuer intel-C-compiler der den 586-Befehlssatz nutzt ist schwer zu überholen wenn es um Kleinigkeiten geht, aber reines ASM ist noch lange lange schneller... Man darf den CALL und das RET nicht vergessen... Für ne Addition lohnt es nicht... Aber ne sinnvolle ASM-Routine (selbst als inline-assembler) schlägt bei auch nur wenig Ahnung fast jeden Compiler... erst recht wenn man sich die Mühe macht Fließpunktrechnungen durchzuführen.
    Assembler ist (meiner Meinung und Erfahrung nach) eben NICHT nur dann
    sinnvoll wenn es um Hardwarenahe (Grafikmodes in ASM sind nunmal die besten 😃 ) programmierung geht...
    Jede Programmiersprache muss bei mir für Mandelbrot-Programme herhalten...
    Vom c64-Basic (ich hatte damals viel Zeit) über dessen Assembler, PowerBasic und C bzw. ASM.
    Das pure (nicht sonderlich optimierte geb ich zu 😋 ) C-Programm
    wurde allein mit ein wenig inline VIIIIEL schneller....
    extern und dann mit 32-bit Befehlen vom reinen ASM kaum zu unterscheiden...

    Das wollte ich doch nurmal gesagt haben und die Fahne für ASM hochhalten!...

    Netten Gruss,
    Enthusi



  • Enthusi schrieb:

    Man darf den CALL und das RET nicht vergessen...

    Wenns mal wirklich relevant ist kann man auch das C-Schlüsselwort inline benutzen 🙂

    Assembler ist (meiner Meinung und Erfahrung nach) eben NICHT nur dann
    sinnvoll wenn es um Hardwarenahe (Grafikmodes in ASM sind nunmal die besten 😃 ) programmierung geht...

    Grafikmodes in ASM? Aber nur unter DOS bitte, ansonsten wirst du damit nciht so viel Spaß haben 🙂
    Auf jeden Fall lohtn sich ASM wegen MMX/SSE/3DNOW wenn man sachen berechnet die mit Grafik zu tun haben, dort kann man dann antürlich immer schön mehrere Pixel auf einmal berechnen 🙂



  • Das pure (nicht sonderlich optimierte geb ich zu ) C-Programm
    wurde allein mit ein wenig inline VIIIIEL schneller....
    extern und dann mit 32-bit Befehlen vom reinen ASM kaum zu unterscheiden...

    Ich weiß ja nicht, mit was für seltsamen Compilern du arbeitest, aber meine erstellen ordentliche 32Bit programme. Dazu brauche ich kein Assembler. Und die Zeiten, in denen ich Assembler zur Grafikprogrammierung verwendet habe (damals noch in QBasic) sind schon lange lange vorbei.

    Man darf den CALL und das RET nicht vergessen...

    Heutzutage inlinen Compiler, wenn es sich (ihrer Meinung nach) lohnt.

    lar ein neuer intel-C-compiler der den 586-Befehlssatz nutzt ist schwer zu überholen

    586 das war doch damals der erste Pentium, nicht war. Ich glaube sowas habe ich irgendwo noch im Keller. Hatte immerhin 90MHz. 😮


Anmelden zum Antworten