Seit wann ist VB schneller als C++?



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



  • Bashar schrieb:

    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.

    Ok, der Zusammenhang ist nicht klar. Ich wollte die Architektur als Ganzes loben 😉
    Und die VM gehört dazu. Der Geschwindigkeitsnachteil durch die VM wird sich in Zukunft minimieren. Die VM ist Fortschritt (die Vorteile sind ja wohl bekannt). Und die umfangreiche Bibliothek (und ihre Organisation!!) ist Fortschritt. Und die verbesserten Sprachmittel sind Fortschritt.
    Das Ganze soll nicht auf Java fixiert sein, das gilt auch für C# und wohl auch für alle Sprachen, die in Zukunft rauskommen.
    Dinge, die C++ eben nicht hat. Diese extrem maschinennahe Programmierung (ja ich weiß, C++ kann auch anders, aber andere Sprachen können das besser) BRINGT Vorteile, aber in Zukunft braucht man das wahrscheinlich nur noch für Treiber und Bibliotheken. Die Programmierung einer eigentlichen Anwendung muss nicht um jeden Preis so ins Detail gehen, sondern soll mit vertretbarem Aufwand möglich sein.
    Und ich würde Sun jetzt nicht unbedingt als Monopolist Nr.1 hinstellen. 😉
    Dazu hat ja Gregor schon was gesagt.



  • Hm, irgendwie hab ich das gefühl das immer das reine Standard C++ stand 1998 mit den neuesten Sprachen verglichen wird.

    Ich hoffe da denkt auch mal jemand an die vielen vielen Libs und erweiterungen die es gibt 🤡

    Unterm Strich spielt performance aber immer weniger eine Rolle.
    Die Menschen Arbeiten nicht schneller aber die Maschienen schon.
    Also kann die Software ruhig langsamer laufen 🤡 Und unbezahlbar ist bei Software die Arbeitszeit. Für was soll eine Schnitstelle für den Benutzer
    extrem optimiert sein. Der Benutzer kann die Daten garnicht so schnell eintippen wie die Oberfläche sie entgegen nehmen kann.

    Zudem: Unterm strich bekommt man die Sprache durch das Umfeld in dem man Arbeitet vorgeschrieben...



  • Wunderbar Opti, du hast bewiesen das C++ besser ist. Dort kann ich für ein Problem zwischen vielen Libs die passende wählen und kann bei Bedarf auch eine performante nehmen.

    BTW Schreibt mal in Java ein Programm, das seinen eigenen Quellcode ausgibt, dann habt ihr wenigstens ein Argument.

    Bye, TGGC



  • @TGGC

    Weshalb sollte eine Anwendung den eigenen Quellcode ausgeben? Um anzugeben?



  • TGGC schrieb:

    BTW Schreibt mal in Java ein Programm, das seinen eigenen Quellcode ausgibt, dann habt ihr wenigstens ein Argument.

    Das ist vollkommen zwecklos und außerdem mit Google innerhalb von 20 Sekunden zu finden:

    class S{public static void main(String[]a){System.out.print((s+=(char)34)+s+';'+'}');}static String s="class S{public static void main(String[]a){System.out.print((s+=(char)34)+s+';'+'}');}static String s=";}

    So, wo bleibt denn nun die C++-Version meines kleinen Programms da oben?



  • Gregor schrieb:

    So, wo bleibt denn nun die C++-Version meines kleinen Programms da oben?

    Wirst du nicht bekommen 😉 Man könnte da etwas auf der Basis von Greenspun's 10th Law formulieren.



  • Du sollst es nicht ergoogeln, sondern selbst schreiben. Aber da du den Zweck ja ehh nicht siehst...



  • Bashar schrieb:

    Man könnte da etwas auf der Basis von Greenspun's 10th Law formulieren.

    Hmmm...

    Greenspun's Tenth Rule of Programming: "Any sufficiently complicated C or Fortran program contains an ad-hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp."

    ...gefällt mir! 😃

    Wirst du nicht bekommen

    Schade, nie bekomme ich, was ich will! 😞 😉



  • TGGC schrieb:

    Wunderbar Opti, du hast bewiesen das C++ besser ist. Dort kann ich für ein Problem zwischen vielen Libs die passende wählen und kann bei Bedarf auch eine performante nehmen.

    BTW Schreibt mal in Java ein Programm, das seinen eigenen Quellcode ausgibt, dann habt ihr wenigstens ein Argument.

    Bye, TGGC

    Sorry, die Organisation, der Umfang und die Dokumentation der Java-Libs ist unerreicht.
    Und warum sollten die weniger performant sein wie C++ Libs?



  • A) wofür brauche ich eine Programm, dass seinen Quellcode ausgibt? 😎 Wie sieht ein entsprechendes C++-Programm aus?


Anmelden zum Antworten