Seit wann ist VB schneller als C++?



  • Jester schrieb:

    ... in str += neuesteil; ändert erhält man auch nochmal einen ordentlichen Performance-Schub.

    Aha, das ist also der Grund warum C langsamer ist. Sehr interessant.

    Sucht doch nicht nach Ausreden.

    Ausserdem wird dieser Teil vom Compiler optimiert.


  • Mod

    http://www.heise.de/ct/ftp/03/21/222/

    das einfachste ist erstmal alle const CString in const CString& replacen, das was jeder c++ anfänger lernt, das muss man die IDE dort noch per replace machen lassen. das bringt bei mir das ding von ~16 auf 9.5 sekunden.

    wenn man dann von CString auf std::string mit der stlport ported, wird das sicherlich schon extrem performance bringen.

    rapso->greets();


  • Mod

    Akzepto schrieb:

    Jester schrieb:

    ... in str += neuesteil; ändert erhält man auch nochmal einen ordentlichen Performance-Schub.

    Aha, das ist also der Grund warum C langsamer ist. Sehr interessant.

    Sucht doch nicht nach Ausreden.

    Ausserdem wird dieser Teil vom Compiler optimiert.

    das problem ist, dass man mit c++ alles machen kann was mit java,c#,vb möglich ist, außerdem kann man noch weitere optimierungen einbringen. es ist also rein logisch nicht möglich dass die sprachen schneller sind als c++.
    c++ setzt aber voraus dass man es in jedem codeabschnitt perfeckt einsetzt damit es aus optimal läuft, wohingegen java,c#,vb generische lösungen haben die für anfänger sehr viel arbeit abnehmen und er nichtmal wissen muss ob ein string kopiert wird oder nur eine referenz übergeben wird, man muss meißt nichtmal den speicher managen was bei optimaler programmierung ein c++ programm selbst macht (siehe whitepaper von AMD und INTEL)

    hier kannst du mal durchlesen wie freaky man sein muss, um das letzte an performance rauszuhollen, das ist in java,c#,vb niemals möglich, weshalb dort nur die gleiche performance wie in c++ zu hollen ist, wenn jemand für den prozessor spezialisierten code in den compiler einbaut...dann wohl in c++ oder delphi oder in welcher hardware naher sprache auch immer...

    http://www.flipcode.com/tutorials/tut_fastmath.shtml

    rapso->greets();



  • Werden wir je diese Stufe der C/C++ Programmierung erreichen? 😃

    Für mich sind C/C++ Programmierer Leute die ständig auf der Suche nach dem optimalen Code sind.


  • Mod

    Akzepto schrieb:

    Werden wir je diese Stufe der C/C++ Programmierung erreichen? 😃

    Für mich sind C/C++ Programmierer Leute die ständig auf der Suche nach dem optimalen Code sind.

    genau das ist es ;), nun hast du es verstanden *hehe*

    das ist auch der grund weshalb du in java für jeden "mißt" eine funktion hat, wie "Optimiser" letztens hier rausfand. sogar um zu prüfen ob eine gerade mit einem box kollidiert gibt es in java ne funktion. wenn man das selbst implementiert in c++ (einfach frei hand), ist man deswegen wohl langsammer, wenn man sich in c++ richtig mühe gibt, kann man für seine speziellen fälle vielleicht schneller sein als die java implementierung, aber sobald man in java etwas machen möchte, wofür es keine lib gibt, dann wird es ziemlich langsam.

    so z.b. kopieren eine speicherausschnittes

    java vielleicht

    for(int a=0;a<Array1.Lenght();a++)
    Array2[a]=Array1[a];
    

    in c++ vielleicht

    for(int a=0;a<sizeof(Array1)/2;a++)
    *reinterpret_cast<double*>(Array1)[a]=*reinterpret_cast<double>(Array2*)[a];
    

    schon hat man die hälfte der schleifendurchläufe und vielleicht die 5% mehr pefromance die c++ eben erlaubt und andere sprachen vielleicht nicht.

    natürlich könnte man in java dann eine lib zum kopieren haben und in c++ das memcpy benutzen. man könnte in c++ aber auch die mmx funktionen mit memory prefetching nutzen und schon ist man wieder fixer als java. dann könnte man das mit DMA transfer auf gewissen systemen mit c++ lösen (z.b. playstation oder gameboy) und in java muss man hoffen dass die lib das von selbst macht.. wobei man das eventuell garnicht möchte und die lib dann extra funktionen bräuchte "memcpyDMA" und "memcpy" für java, wenn man glück hat. in C++ baut man sich die eben mal selbst ein und hat das optimum das man haben möchte.

    c++:
    erlaubt für alles optimum, man muss es aber oft selbst richtig anstellen

    java:
    hat für vieles optimale libs (die dann eigentlich grundsätzlich mit c++ mithalten), wenn es etwas ausgefallenes ist, dann muss man es selbst erstellen und ist dann oft viel langsammer als c++ (wegen weniger erfahrung mit optimierung und dem allgemeinem code von java gegenüber für dem für eine cpu optimierten code von c++)

    rapso->greets();



  • rapso schrieb:

    so z.b. kopieren eine speicherausschnittes

    Tut mir leid, auch dafür gibt es eine entsprechende Methode in Java: System.arraycopy
    😃 😃 😃



  • rapso schrieb:

    das problem ist, dass man mit c++ alles machen kann was mit java,c#,vb möglich ist, außerdem kann man noch weitere optimierungen einbringen. es ist also rein logisch nicht möglich dass die sprachen schneller sind als c++.

    Das Problem ist, dass du nur dann alles in C++ machen kannst, was Java machen kann, wenn du Java nachprogrammierst. Kann C++ von Haus aus Inlining bei vorliegender Laufzeitpolymorphie machen? Nein, denn dafür braucht man eine virtuelle Maschine. Das kannst du erst, wenn du dir eine virtuelle Maschine in C++ programmiert hast. Alles, was Java kann, kannst du entsprechend erst, wenn du Java komplett nachprogrammiert hast.


  • Mod

    Gregor schrieb:

    rapso schrieb:

    so z.b. kopieren eine speicherausschnittes

    Tut mir leid, auch dafür gibt es eine entsprechende Methode in Java: System.arraycopy
    😃 😃 😃

    das hab ich auch geschrieben im anschluss, das hier war, wie es da auch steht, nur ein beispiel.

    rapso->greets();


  • Mod

    Gregor schrieb:

    rapso schrieb:

    das problem ist, dass man mit c++ alles machen kann was mit java,c#,vb möglich ist, außerdem kann man noch weitere optimierungen einbringen. es ist also rein logisch nicht möglich dass die sprachen schneller sind als c++.

    Das Problem ist, dass du nur dann alles in C++ machen kannst, was Java machen kann, wenn du Java nachprogrammierst. Kann C++ von Haus aus Inlining bei vorliegender Laufzeitpolymorphie machen? Nein, denn dafür braucht man eine virtuelle Maschine. Das kannst du erst, wenn du dir eine virtuelle Maschine in C++ programmiert hast. Alles, was Java kann, kannst du entsprechend erst, wenn du Java komplett nachprogrammiert hast.

    klar geht das, schonmal von selfmodifing code gehört? an der stelle wo du eine optimierung möchtest machst du einen jump zu einer funktion die die daten analysiert und dann den entsprechenden code anstelle des jumps einbindet.

    außerdem, inlining macht die cpu, dafür gibt es extra seit dem pentium-class eine laufzeitoptimierung (bzw. eigentlich macht das der K5 als erste cpu), der Itanium compiler gibt dabei der cpu sogar eine hilfestellung, der itanium besteht aus doppelt sovielen einheiten wie nötig und arbeitet parallel immer zwei mögliche wege, wenn ein conditionaljump eintritt wird dann der richtige weitergerechnet.
    zu dem gibt es für c++ profiler die das programm zur laufzeit analysieren und im nachinein nochmal umkopilieren damit es für die zu erwartenden daten optimal läuft, dabei kannst du der cpu mit der richtigen condition beim bedingten spung auch selbst genau angeben was erwartet wird (also ob der sprung stattfindet oder nicht).

    ich bezweifle mal dass java "selfmodifing code" erlaubt oder garantieren kann dass es eine condition so stellt, dass es auf dem gerade laufendem prozessor mit der jumpprediction richtig interagiert.

    rapso->greets();

    ps. es gibt virtuellmaschines und garbage collectors für c++, also egal welches argument du bringst, du könntest diese spezialfälle _auch_ mit c++ lösen.



  • Die Diskusionen führen nicht weiter.

    Jede Sprache ist für einen Speziellen Anwendungsfall entwickelt worden.
    Die "beste" Sprache gibt es einfach nicht. Diskusionen dieser Art gab es massig im Forum.

    Leute die wirklich C++ Programmieren werden es ähnlich sehen das jede sprache ihren Einsatzbereich hat. Geschwindigkeit ist nicht alles im leben. Zeit kostet Geld. Und meistens ist die Entwicklungszeit teurer als die Laufzeit des Programmes.

    Was ich aber ätzend finde sind Leute die Argumentieren das C schlecht und schwer zu erlernen ist. Wenn C zum Vergleich herangezogen wird dann bitte die zu vergleichenden Sprachen aus dem passenden Jahr vergleichen.

    Wo war denn Java mitte 1990 ?

    Wir vergleichen also das neueste Java Hight Tech mit alter schmiedekunst.

    Das es C++ gibt sollte sich eigentlich rumgesprochen haben. Dadurch wird die Ausführung der Programme nicht unbedingt generell schneller, aber es ist wesentlich einfacher zu erlernen und anzuwenden.

    Wer sich an Diskusionen C++ vs XX laben will kann ja mal die Suchmaschiene benutzen die das Forum bietet. Da gibts massig stoff zu.



  • Akzepto schrieb:

    Jester schrieb:

    ... in str += neuesteil; ändert erhält man auch nochmal einen ordentlichen Performance-Schub.

    Aha, das ist also der Grund warum C langsamer ist. Sehr interessant.

    Sucht doch nicht nach Ausreden.

    Ausserdem wird dieser Teil vom Compiler optimiert.

    Nein, wird er nicht, darf der Compiler nicht. Der Copy-Ctor-Aufruf ist garantiert. Ein temporäres Objekt anlegen, das dann kopieren... kostet halt mehr. Wenn Du's ned glaubst probier's aus!


  • Mod

    Jester schrieb:

    Akzepto schrieb:

    Jester schrieb:

    ... in str += neuesteil; ändert erhält man auch nochmal einen ordentlichen Performance-Schub.

    Aha, das ist also der Grund warum C langsamer ist. Sehr interessant.

    Sucht doch nicht nach Ausreden.

    Ausserdem wird dieser Teil vom Compiler optimiert.

    Nein, wird er nicht, darf der Compiler nicht. Der Copy-Ctor-Aufruf ist garantiert. Ein temporäres Objekt anlegen, das dann kopieren... kostet halt mehr. Wenn Du's ned glaubst probier's aus!

    [ergaenz]
    darf er optimieren wenn seine logic rausfindet dass dadurch kein logischer unterschied entsteht.. könnte sogar sein, dass er alles inlined und dann unnötiges kopieren von variablen auflöst.

    aber einfach so grundsätzlich aus a=a+1; a+=1; oder a++; darf er wohl nicht.[/ergaenz]

    rapso->greets();



  • das problem ist, dass man mit c++ alles machen kann was mit java,c#,vb möglich ist, außerdem kann man noch weitere optimierungen einbringen. es ist also rein logisch nicht möglich dass die sprachen schneller sind als c++.

    Gewagte Aussage. Ich schreib dir mal ein kleines Javaprogramm, das extrem auf Javas Reflexionsfähigkeiten beruht und du bastelst mir dann das entsprechende C++-Programm. Ich wünsche schonmal viel spaß.

    Vielleicht sollte doch lieber Gregor doer sonstwer das Programm schreiben, da meine Javakentnisse recht mieß sind.


  • Mod

    Helium schrieb:

    das problem ist, dass man mit c++ alles machen kann was mit java,c#,vb möglich ist, außerdem kann man noch weitere optimierungen einbringen. es ist also rein logisch nicht möglich dass die sprachen schneller sind als c++.

    Gewagte Aussage. Ich schreib dir mal ein kleines Javaprogramm, das extrem auf Javas Reflexionsfähigkeiten beruht und du bastelst mir dann das entsprechende C++-Programm. Ich wünsche schonmal viel spaß.

    Vielleicht sollte doch lieber Gregor doer sonstwer das Programm schreiben, da meine Javakentnisse recht mieß sind.

    ich hab nicht gesagt, dass es einfacher ist oder dass es schlau wäre alle sachen mit c++ zu machen, aber zu behaupten java wäre schneller ist leider absurt.

    von mir aus können wir was einfaches machen, ein programm das ein einziges dreieck zeichnet oder sonst was, wobei man nicht ne fertige lib nutzt und die performance vergleichen.

    am ende wirst du auch drauf kommen, dass assembler das schnellste sein muss, weil alles darauf basiert... trotzdem codet man nicht sonderlich viel damit. die meißten programme von heute sind garnicht auf performance getrimmt, sondern darauf mit generischen lösungen die vorgabe zu erreichen. insofern ist c++, java, c# ... gleich gut um seine arbeit zu erfüllen. java hat ein paar mehr libs die viele sachen optimal erledigen (wenn man für sein tun die gerade nötigen funktionen kennt) und c++ hat atomarere lösungen die erlauben für performance sehr hardwarenah zu coden.

    ich weiß nicht was das eigentlich immer soll, wozu wollen andere sprachen schneller sein als die sprachen mit denen sie eventuell erstellt wurden? das ist rein logisch nicht möglich. wozu? früher wurde auch oft behauptet dass c schneller als assembler sei und c++ schneller als c (darauf versteifen sich heute immer noch leute) und nun java/c# vs. c++ 🙄

    rapso->greets();



  • rapso schrieb:

    ich weiß nicht was das eigentlich immer soll, wozu wollen andere sprachen schneller sein als die sprachen mit denen sie eventuell erstellt wurden? das ist rein logisch nicht möglich. wozu? früher wurde auch oft behauptet dass c schneller als assembler sei und c++ schneller als c (darauf versteifen sich heute immer noch leute) und nun java/c# vs. c++ 🙄

    1. Ich kann dir sagen, was das bei Java soll:

    Java hat nunmal ein "Ist lahm"-Image, was früher auch sehr berechtigt war. Da es dieses Image einfach nicht los wird, weise ich zumindest öfter mal darauf hin, dass Java garnicht so lahm ist. Es geht mir da aber nicht darum, Java schneller als C++ darzustellen, es geht mir nur darum, darauf hinzuweisen, dass die Sprachen mitlerweile so ziemlich in der gleichen Liga spielen, was die Geschwindigkeit entsprechender Programme betrifft.

    2. Deine Assembler-ist-am-Schnellsten Argumentation hat eine Schwachstelle. Diese Schwachstelle ist der Mensch. Bei Assembler kannst du zwar sagen, dass es nur am Programmierer liegt, der ja eigentlich perfekt sein könnte, wenn du mit dem gleichen Argument aber aussagen möchtest, dass C++ immer schneller als Java sein kann, dann ist das falsch. Bei C++ liegt es nicht nur am Programmierer des jeweiligen Programms, sondern auch am Compiler bzw. am Programmierer des Compilers. Ich bin mir ziemlich sicher, dass alle Compiler, die es so gibt, sehr suboptimal sind. Zudem ist es bei C++ schwieriger, gute Compiler zu schreiben, als bei Java, da die Sprache deutlich komplexer ist. Ok, C/C++ gibt es schon länger, entsprechend hatten die Menschen mehr Zeit, die Compiler zu optimieren, mit anderen Worten heißt das aber, dass bei Java noch mehr rauszuholen ist, als bei C++.



  • Helium schrieb:

    Gewagte Aussage. Ich schreib dir mal ein kleines Javaprogramm, das extrem auf Javas Reflexionsfähigkeiten beruht und du bastelst mir dann das entsprechende C++-Programm. Ich wünsche schonmal viel spaß.

    Vielleicht sollte doch lieber Gregor doer sonstwer das Programm schreiben, da meine Javakentnisse recht mieß sind.

    Ich habe mal ein altes Testprogramm von mir ausgegraben und kurz etwas verändert, damit man es hier gebrauchen kann. Es nutzt etwas Reflection, nutzt die Möglichkeiten, die man mit Reflection hat, aber bei weitem nicht aus. Naja, da ist es, macht damit, was ihr wollt:

    import java.lang.reflect.*;
    
    public class ReflectTest
    {  
       public static void main(String[] args)
       {
          Class classObject = ReflectTest.class;
          printFields (classObject);
          printMethods (classObject);
       }
    
       public static void printFields (Class classObject)
       {
          System.out.println ("FIELDS :");
          System.out.println ();
          Field [] fields = classObject.getDeclaredFields();
          for (int i = 0 ; i < fields.length ; ++i)
          {
             int modifiers = fields[i].getModifiers();
             System.out.print (getModifierString(modifiers));
             System.out.print (getTypeString (fields[i].getType()) + " ");
             System.out.println (fields[i].getName());
          }
          System.out.println();
       }
    
       public static void printMethods (Class classObject)
       {
          System.out.println ("METHODS :");
          System.out.println();
          Method [] methods = classObject.getDeclaredMethods();
          for (int i = 0 ; i < methods.length ; ++i)
          {
             int modifiers = methods[i].getModifiers();
             System.out.print (getModifierString(modifiers));
             System.out.print (getTypeString (methods[i].getReturnType()) + " ");
             System.out.print (methods[i].getName() + "(");
             Class [] parameterTypes = methods[i].getParameterTypes();
             for (int j = 0 ; j < parameterTypes.length ; ++j)
             {
                System.out.print (getTypeString (parameterTypes [j]));
                if (j != parameterTypes.length -1) System.out.print (",");
             }
             System.out.println (")");
          }
          System.out.println();
       }
    
       public static String getModifierString (int modifiers)
       {
          String outString = new String ();
          if (Modifier.isPrivate(modifiers)) outString += "private ";
          if (Modifier.isProtected(modifiers)) outString += "protected ";
          if (Modifier.isPublic(modifiers)) outString += "public ";
          if (Modifier.isAbstract(modifiers)) outString += "abstract ";
          if (Modifier.isFinal(modifiers)) outString += "final ";
          if (Modifier.isNative(modifiers)) outString += "native ";
          if (Modifier.isStatic(modifiers)) outString += "static ";
          if (Modifier.isSynchronized(modifiers)) outString += "synchronized ";
          if (Modifier.isTransient(modifiers)) outString += "transient ";
          if (Modifier.isStrict(modifiers)) outString += "strictfp ";
          if (Modifier.isVolatile(modifiers)) outString += "volatile ";
          if (Modifier.isInterface(modifiers)) outString += "interface ";
          return outString;
       }
    
       public static String getTypeString (Class type)
       {
          String outString = new String ();
          if (type.isArray())
          {
             outString += getTypeString(type.getComponentType()) + "[]";
          }
          else
          {
             outString += type.getName();
          }
          return outString;
       }
    }
    

    Mich würde durchaus interessieren, wie ein entsprechendes C++-Programm aussieht.


  • Mod

    in c++ gibt es zeiger, du kannst einen zeiger direckt auf deinen code bekommen und somit den code modifizieren mit assemblerbefehlen, somit hast du jede möglichkeit die assembler auch hat. das schafst du nicht mit java. das ist auch der grund, weshalb man in wohl jeden c++ compiler auch assembler einbinden kann (im c source), weil es leute sowieso auf umwegen gemacht hätten.
    das kannst du mit java nicht, du kannst, wenn du z.b. die auflösung eines programms feststellst, nicht die konstanten im quellcode direckt ändern damit ein memoryzugriff wegoptimiert wird. wenn du weißt was dein c++ compiler anstellt geht das...

    das macht c++ eben so schön, du kannst auf hocher ebene programmieren, aber der weg zur hardware wird dir nicht versperrt.

    rapso->greets();



  • Ihr überseht da irgendwie was IMHO. Bei einem Software-Projekt muss man mehrere Dinge unter einem Hut bekommen.
    Zusätzlich zu der Performance eines Programms z.B. Entwicklungszeit/-kosten/-aufwand.
    Und der ist z.B. bei Java wesentlich geringer. Hey, um mir das Leben halbwegs zu vereinfachen, hab ich mir erstmal eine String-Klasse geschrieben (die zugegebenermaßen nicht perfekt ist, aber ihren Zweck erfüllt). Wie soll ich sonst Dateien laden, die "BildX" (X von 1 - 30) heißen? In java gibt es eine fertige String-Klasse, die wirklich GODLIKE ist und (ACHTUNG: das ist der Punkt) von allen Schnittstellen akzeptiert wird.
    Beispiel: "Mein Text" ist in Java kein const char*, kein const wchar_t* und auch sonst nichts, sondern eine Instanz der Klasse String, die ohne weiteres zutun mit Unicode läuft und auch sonst alle erdenklichen Features bietet.

    Ein weiteres Beispiel ist in einem anderen Thread in diesem zu finden. Ich habe zwei Tage investiert, um eine Funktion zu schreiben, die prüft, ob eine Linie ein Quadrat schneidet. Die Java-Version (eine fertige Funktion in einer fertigen Klasse) hab ich nach 5Minuten gefunden.

    PERFORMANCE IST NICHT ALLES.

    Die Rechner werden immer schneller und der Performance-Verlust von VMs wird sich zu einem immer kleinerem Prozentsatz auswirken. Ob ihr es wahrhaben wollt oder nicht, aber das Konzept von Java ist in vielerlei Hinsicht ein Konzept für die Zukunft. Software wird immer komplexer und man kann es sich nicht mehr erlauben, alles neu zu beginnen. C++ war ein Schritt in die richtige Richtung und Java/C# setzt ihn weiter fort. 😋



  • Zwischen der Vielfalt der Bibliothek von Java und der VM bzw. den Performanceproblemen läßt sich aber nur mit viel gutem Willen ein Zusammenhang herphantasieren. Mir scheint du lobst in erster Linie die Macht von Sun, die über ihr Baby entscheiden können was sie wollen. C++ dagegen ist im Prinzip unabhängig, der Standard enthält nur das, worüber sich eine Gruppe von Anwendern und Compilerherstellern in Jahrelanger Arbeit einigen konnten.
    Mit der VM oder "Performance ist nicht alles" hat das überhaupt nichts zu tun.



  • Bashar schrieb:

    Mir scheint du lobst in erster Linie die Macht von Sun, die über ihr Baby entscheiden können was sie wollen. C++ dagegen ist im Prinzip unabhängig, der Standard enthält nur das, worüber sich eine Gruppe von Anwendern und Compilerherstellern in Jahrelanger Arbeit einigen konnten.

    Die Entwicklung von Java geschieht durch den Java Community Process. Dieser besteht bei weitem nicht nur aus Sun, sondern aus diversen Firmen und Einzelpersonen. Entscheidungen im JCP werden demokratisch getroffen.


Anmelden zum Antworten