Seit wann ist VB schneller als 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.
-
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 laufenUnd 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
-
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?
-
helium logged out schrieb:
A) wofür brauche ich eine Programm, dass seinen Quellcode ausgibt?
Wie sieht ein entsprechendes C++-Programm aus?
A)um die aktuellen modifikationen beim "self modifikation code" sich ansehen zu können
siehe C)
C) wie schnell ist ein schneller rasteriser in java [edit] einfach nur zbuffer rendering in den graustufen, wir zeigen dir dann wieviel schneller c++ ist[/edit]rapso->greets();
-
Optimizer schrieb:
Und warum sollten die weniger performant sein wie C++ Libs?
die libs selbst, sofern sie auf die spezielle cpu angepasst sind, sollten gleich schnell sein, bloss java ist langsammer, weil java im bytecode kommt. das ist weder eine hochsprache noch ein richtiger assembler, somit läuft es auf einer cpu nicht mehr optimal.
rapso->greets();
-
@raspo: Nur so am Rande: Ich bin fast reinrassiger C++-Programmierer. Aber die Geschwindigkeit geht mir ziemlich am Arsch vorbei.
-
sterben solche bescheuerten threads eigentlich nie aus?
megarofl
-
Klar, gleich nach den beknackten Newbie Fragen.