[Perfromance Benchmark] Java - C++
-
Optimizer schrieb:
Und was hat das mit Java zu tun? Ich verstehs nicht. Sonst ist man sich immer einig, dass es mehr bringt, Algorithmen zu optimieren und die richtige Datenstrukturen zu wählen, anstatt mit irgendwelchen Byte-h4cks noch was rauszuholen. Und wenns um Java geht, dann liegt es auf einmal an Java. Ahja, alles klar. Allmählich sollte das doch durchgedrungen sein, dass der entscheidenste Faktor vor dem Bildschirm sitzt.
Ja, es ist durchgedrungen. Es ist doch aber merkwürdig, dass große Java-Anwendungen im Allgemeinen langsamer sind.
Und das JCreator überhaupt eine IDE ist, ist mir auch neu.

Ich hab ja gesagt, ich kenn das Ding nicht. Dass es keine IDE ist, spricht aber eigentlich *für* meinen Punkt.
Ich habe auch wie gesagt, mit Eclipse definitiv keine Probleme mehr seit 3.1 was nur bestätigt, dass es ne Implementierungsfrage war. Nur um mal bei diesem konkreten Beispiel zu bleiben.
Es gibt irgendwie genug konkrete Beispiele, wo die Implementierung wohl nicht ganz sauber war.
-
Optimizer schrieb:
Und das Visual Studio ne "vernüftige" IDE ist, ist mir auch neu. Es ist ne brauchbare IDE, bei der aber viel zu viele Features fehlen.
Wer entscheidet denn was in eine IDE gehört und was nicht? VS hat genug Features, damit man vernünfig damit arbeiten kann. Der Rest kann nachgerüstet werden (Visual Assist, Bounds-Checker etc.).
-
Optimizer schrieb:
Stimmt, es gibt keine langsamen C++ Anwendungen.
Klar. Du hast das essentielle erfasst.
Damit ist die Diskussion wohl beendet.
Dann lass mich die Frage anders stellen:
warum macht es Java dem programmierer so schwer performante Anwendungen zu schreiben?Wir haben festgestellt, dass es nicht an java liegt, dass diese zig tausend Beispiele die gebracht wurden so negativ fuer Java ausfallen. Deshalb muss die Sprache wohl minderwertig sein, wenn man keine vernuenftige Performance zusammenbringt. Oder?
Natuerlich ist das ueberspitzt dargestellt. Aber was will man sonst machen? Wenn man sagt: alle programme die bei mir auffallend langsam liefen waren Java programme, dann wird einem vorgeworfen zu verallgemeinern und zu behaupten java sei lahm.
wie waer es mal mit gruenden?
die bisher genannten gruende sind: schlechte programmierung. also ist meine frage: warum sind so viele state-of-the-art java anwendungen schlecht programmiert (einschliesslich sun eigener entwicklungen)?
ist diese frage genehmer? oder ist es einfach nur pech dass bei mir die java anwendungen langsam laufen? es mag durchaus schnelle java anwendungen geben, keine frage - nur ich habe noch keine komplexe gesehen.
liegt natuerlich an mir und nicht an java, ist ja klar.
-
warum kann man sich nich drauf einigen dass sowohl c++ als auch java in bestimmten
berecihen extrem stark is... und gut issie wiegen sich nich gegeneinander auf... andernfalls wäre eine von beiden längst in der versenkung verschwunden wie soviele andere
-
Sovok schrieb:
warum kann man sich nich drauf einigen dass sowohl c++ als auch java in bestimmten
berecihen extrem stark is... und gut issie wiegen sich nich gegeneinander auf... andernfalls wäre eine von beiden längst in der versenkung verschwunden wie soviele andere
Im Anwendungsbereich versinkt C++ gerade oder ist zumindest erheblich bedroht. Was glaubst du, warum die Stimmung hier so aggressiv gegenüber Sprachen wie Java oder C# ist?
Was diese schlechten Reaktionen von Java IDEs bezüglich Codecompletion Fenstern und so betrifft, sollte man sich mal fragen, ob die C++ IDEs da genausoviel leisten (müssen), wenn so ein Fenster geöffnet wird. Bei Java wird dort allein schon bezüglich der Standardbibliothek in einer 16,7MB großen Zip-Datei und in einer 37,9MB großen Jar-Datei nach Informationen gesucht. In was muss eine C++ IDE suchen? Wieviele Daten sind das? Liegen die auch in einem gepackten Format vor?
-
ÄpfelUndBirnen schrieb:
Sovok schrieb:
warum kann man sich nich drauf einigen dass sowohl c++ als auch java in bestimmten
berecihen extrem stark is... und gut issie wiegen sich nich gegeneinander auf... andernfalls wäre eine von beiden längst in der versenkung verschwunden wie soviele andere
Im Anwendungsbereich versinkt C++ gerade oder ist zumindest erheblich bedroht. Was glaubst du, warum die Stimmung hier so aggressiv gegenüber Sprachen wie Java oder C# ist?
Quatsch! Es wird immernoch ein Großteil in C++ entwickelt und daran wird sich auch in naher Zukunft nichts ändern. Nicht alle Firmen können es sich leisten den kompletten Code wegzuschmeißen und auf eine andere Sprache zu setzen, wenn nicht klare Vorteile dadurch entstehen (und das ist nicht der Fall).
ÄpfelUndBirnen schrieb:
Was diese schlechten Reaktionen von Java IDEs bezüglich Codecompletion Fenstern und so betrifft, sollte man sich mal fragen, ob die C++ IDEs da genausoviel leisten (müssen), wenn so ein Fenster geöffnet wird. Bei Java wird dort allein schon bezüglich der Standardbibliothek in einer 16,7MB großen Zip-Datei und in einer 37,9MB großen Jar-Datei nach Informationen gesucht. In was muss eine C++ IDE suchen? Wieviele Daten sind das? Liegen die auch in einem gepackten Format vor?
Je nach dem welche Libraries eingesetzt werden muss man auch so viel durchsuchen (z.B. MFC). VS cached die Sachen scheinbar nur besser als manche Java IDE und die Daten sind nicht gepackt (warum auch?).
-
@Shade, all:
Java ist wie ich schon mehrfach erwähnt habe, merklich langsamer bei GUI's! Das bestreitet auch Optimizer nicht. Es ist nur zu überspitzt von euch dargestellt.
Jetzt beantwortet uns doch folgende Fragen:
Warum pusht eine Firma wie Oracle Java ohne Ende?
Warum pusht eine Firma wie IBM Java ohne Ende?
Warum pusht eine Firma wie SAP Java ohne Ende?
(alle drei würde ich zu absoluten Riesen im IT Bereich sehen)Warum entwickelt MS mit C# ein gegenstück zu Java?
Warum boomt J2EE ohne Ende?
-
Entwickler schrieb:
@Shade, all:
Java ist wie ich schon mehrfach erwähnt habe, merklich langsamer bei GUI's! Das bestreitet auch Optimizer nicht. Es ist nur zu überspitzt von euch dargestellt.
Jetzt beantwortet uns doch folgende Fragen:
Warum pusht eine Firma wie Oracle Java ohne Ende?
Warum pusht eine Firma wie IBM Java ohne Ende?
Warum pusht eine Firma wie SAP Java ohne Ende?
(alle drei würde ich zu absoluten Riesen im IT Bereich sehen)Warum entwickelt MS mit C# ein gegenstück zu Java?
Warum boomt J2EE ohne Ende?^
MS hat doch schon vorher ein gegenstück zu java entwickelt das ohne ende gefloppt is
dass MS was aufn markt schmeisst sagt an sich nix auswas das versinken von c++ angeht... bei dem anteil den c++ hat kann man wohl kaum von versinken sprechen wenn n paar prozente an andere sprachen abgehn
was deine drei riesen angeht
die pushen es wohl nich sondern wenden es sinnvoll in bereichen an in denen es ein mehraufwand wäre c++ zu verwenden. dagegen sagt ja auch keiner was.
aber java is genausowenig ne wollmilchsauausserdem läuft auf meinem rechner keine software von oracle, ibm oder sap
und keine der firmen kann auf c++ komplett verzichten.
-
Walli schrieb:
Je nach dem welche Libraries eingesetzt werden muss man auch so viel durchsuchen (z.B. MFC). VS cached die Sachen scheinbar nur besser als manche Java IDE und die Daten sind nicht gepackt (warum auch?).
VC++ legt sich seine eigenes Datenbankfile ab. Man kann ja einstellen ob es die Browseinformationen ablegen soll, auch wie die Datei heißt darf man selbst bestimmen.
-
Nicht alle Firmen können es sich leisten den kompletten Code wegzuschmeißen und auf eine andere Sprache zu setzen, wenn nicht klare Vorteile dadurch entstehen (und das ist nicht der Fall).
bei uns wird grad überlegt vb durch java zu ersetzen
bin da n bischen skeptisch... hab schon viel negatives über die java gui entwicklung gehörtc muss so oder so bleiben weil java nich die nötige hardwarenähe für kameratreiber bietet
und bei den mathelibs hätte man keinen vorteil sie in java statt c++ zu schreibenbei den extrem zeitintensiven algos wird weiterhin jeweils eine c und eine assembler version existieren, wobei die assembler version via mmx zwar 200-400% schneller is, aber halt nich auf den embedded systemen läuft
-
Entwickler schrieb:
borg schrieb:
also wer sagt java/swing sei genauso schnell wie c++/Qt leidet ganz klar an realitätsverlust.
Wo steht das?
Entwickler schrieb:
Java ist wie ich schon mehrfach erwähnt habe, merklich langsamer bei GUI's! Das bestreitet auch Optimizer nicht.
*kopfschüttel*
Entwickler schrieb:
borg schrieb:
da gibts doch gar nichts zu diskutieren.
Wenn ich mal zitieren darf WER als erstes damit angefangen hat:
borg schrieb:
wie wärs wenn er mal swing mit Qt/winapi vergleicht, da bin ich ja mal aufs ergebnis gespannt.
*kopfschüttel*
Duden schrieb:
Rhetorische Frage
Die rhetorische Frage ist ein rhetorisches Stilmittel. Sie ist eine Frage, auf die keine Antwort erwartet wird. Rhetorische Fragen werden häufig statt eines Aussagesatzes verwednet, um eine Aufforderung oder Aussage besonders nachdrücklich zu gestalten. Die Antwort gilt als selbstverständlich
ich wollte damit andeuten das swing langsam ist, keine diskusion herauf beschwören.
-
Und wo ist deine rhetorische Frage?
wie wärs wenn er mal swing mit Qt/winapi vergleicht, da bin ich ja mal aufs ergebnis gespannt.
Du kannst höchstens von Ironie sprechen.
-
Ich hätte eine rhetorische Frage:
Findet ihr nicht langsam diese 10 Seiten "Java - C++" Threads ermüdend?
-
Michael E. schrieb:
Und wo ist deine rhetorische Frage?
wie wärs wenn er mal swing mit Qt/winapi vergleicht, da bin ich ja mal aufs ergebnis gespannt.
Du kannst höchstens von Ironie sprechen.
der erste teil des satzes ist irgendwie schon eine frage, auch wenn kein fragezeichen da ist.
aber gut, da lass ich mit mir reden, dann wars halt ironie :p
-
@borg: Dann schreib doch mal so einen GUI-Test. Nicht nur dich interessiert das Ergebnis. Allerdings ist es nicht ganz leicht, so einen Test zu schreiben. Rate mal, warum man nirgendwo einen findet.
-
hmm. ja, komische messung.
noch ne zeitmessung ins programm eingebaut:#include <iostream> #include <string> using namespace std; int main(int argc, char *argv[]) { clock_t start=clock(); int i, n = ((argc == 2) ? atoi(argv[1]) : 10000000); string str; size_t capacity = 31; str.reserve(capacity); // as per C-string size_t newLength = 6; for (i = 0; i < n; i++) { if(newLength > capacity) { capacity *= 2; str.reserve(capacity); } str += "hello\n"; newLength += 6; } cout << str.length() << endl; cout<<(clock()-start)/double(CLOCKS_PER_SEC)<<" sec"<<endl; return 0; }ergibt bei mir
8.722 secjetzt mal den vorschlag nehmen, zu vermuten, daß std::string den trick mit capacity eh schon selber kann:
int main(int argc, char *argv[]) { clock_t start=clock(); int i, n = ((argc == 2) ? atoi(argv[1]) : 10000000); string str; for (i = 0; i < n; i++) str += "hello\n"; cout << str.length() << endl; cout<<(clock()-start)/double(CLOCKS_PER_SEC)<<" sec"<<endl; return 0; }7.97 sec
aha. also schon richtig, daß der tester c++ nicht wie seine westentasche kannte.
mal schauen, wieviel es bringt, noch nen string zu nehmen.
6.97 sec.int main(int argc, char *argv[]) { clock_t start=clock(); int i, n = ((argc == 2) ? atoi(argv[1]) : 10000000); string hello="hallo\n"; string str; for (i = 0; i < n; i++) str += hello; cout << str.length() << endl; cout<<(clock()-start)/double(CLOCKS_PER_SEC)<<" sec"<<endl; return 0; }und dann kam noch das argument "da wr ja eigentlich wissen, was wir wollen, können wir auch gleich das ergebnis erzeugen".
string hello="hallo\n"; string str; str.reserve(hello.size()*n); for (i = 0; i < n; i++) str += hello; cout << str.length() << endl;6.04 sec
oder gemeinerweise
string hello="hallo\n"; string str; str.reserve(hello.size()*n); /* for (i = 0; i < n; i++) str += hello; */ cout << str.length() << endl;0 sec!
ok, man wird behaupten, das gelte nicht. ist aber an sich kacke, was zu messen, was man nie scheiben würde. mal mit gewalt bei += bleiben und die anzahl der aufrufe ein klein wenig senken.
string hello="hallo\n"; string str; while(n!=0){ while(n%2==0){ n/=2; hello+=hello; } --n; str+=hello; }2.62 sec
mal den code von Ponto auf meiner maschine messen.
char hallo[] = "Hallo\n"; int const size = strlen(hallo); string str(size * n, 0); std::string::iterator iter = str.begin(); for ( int i=0; i != n; ++i ) { for (int j = 0; j != size; ++j) { *iter = hallo[j]; ++iter; } }1.98 sec
naja, in dieser richtung könnte man weitermachen, zum beispiel
char const hallo[]="Hallo\n"; int const size=strlen(hallo); string str(n*size,0); int const bigSize=sizeof(int)*size; int* bigHallo=new int[size]; { string bigHalloStr; for(size_t i=0;i<sizeof(int);++i) bigHalloStr+=hallo; memcpy(bigHallo,&*bigHalloStr.begin(),bigSize); } { int* pi=(int*)&*str.begin(); while(n>=sizeof(int)){ for(int i=0;i<size;++i) *pi++=bigHallo[i]; n-=4; } char* pc=(char*)pi; while(n>0){ for(int i=0;i<size;++i) *pc++=hallo[i]; n-=1; } } // cout<<str<<endl; cout << str.length() << endl;1.17 sec
das geht eben in java nicht so fein. man kommt einfach nicht gescheit an die interna ran. nun mag der javaianer sagen, dads sei auch nie notwendig. der kunde kann ja nen schnelleren rechner kaufen. und außerdem dürfe man nur die entwicklungszeit zählen, denn die bezahle man selber, und nie die laufzeit. hab ich alles schon gehört.
oder man geht in c++ den weg in die andere richtung...
class MultiString{ private: string str; int count; public: MultiString(string const& _str,int _count): str(_str), count(_count){ } int length(){ return count*str.length(); } //op[] //op<< };0 sec. klar.
in diesen regionen des abstrahierens kann java auch nicht folgen. hier spielt c++ klar seinen vortiel des zero abstaction overhead aus. mit überladenen operatoren kriegt man die klasse schnell hin, daß sie sich in der anwendung wie ein konstanter string anfühlt. ist die variable n zur compilezeit bekannt, kann man sie als template-parameter benutzen und nochmal sparen. mit ein wenig aufwand kriegt man c++-programme oft viel schneller als mit dem erstbesten ansatz.
hat man vor, auch ein wenig aufwand zu treiben, um sein programm schnell wie assembler zu machen, ist c++ ganz ok als sprache. will man (oder kann man) das nicht, ist java ganz ok. nur ist es ein fehler, in c++ ein programm zu messen, das einfach mal so hingeschrieben wurde. das sollte man in c++ nicht machen, dafür gibt's andere sprachen.
gewonnen hat übrigens
int main(int argc, char *argv[]){ cout<< ((argc == 2) ? atoi(argv[1]) : 10000000) * (sizeof("Hallo\n")-1)<<'\n'; }
-
@volkard: Mir ist nicht ganz klar, was du mit dem letzten Beispiel sagen willst. So etwas kann ich selbstverständlich auch in Java schreiben. Auch ist mir nicht klar, was das mit
in diesen regionen des abstrahierens kann java auch nicht folgen. hier spielt c++ klar seinen vortiel des zero abstaction overhead aus.
zu tun hat. So etwas verursacht in Java mit Sicherheit auch keinen Overhead, der JIT-Compiler kann genauso Methoden inlinen und anderen Overhead sehe ich dort nicht.
Ungetestet:
final class MultiString { public MultiString(String string, int count) { this.string = string; // Referenzzuweisung, String ist immutable - effizienter als bei dir this.count = count; } public int getLength() {return string.length() * count;} public char charAt(int index) {return string.charAt(index % string.length());} public append(PrintStream out) { for( int i = 0; i < count; ++i ) out.print(string); } private final String string; private final int count; }Die anderen Beispiele konnte ich mir jetzt grad vorm Essen nicht mehr ansehen. Aber ich bitte dich mal um eine genauere Erklärung für das letzte.

EDIT2: Ich sehe diese aufgezwungene und fest im Gedächtnis verankerte Sprachabhängigkeit irgendwie nie. Das ist doch nur eine Frage des Algorithmus. Sehe ich das richtig, dass der Gag hier doch ist, den String nicht im Speicher zu halten, sondern erst bei der Ausgabe nacheinander auszugeben? Das kann ich doch mit jeder Sprache machen. Wir wissen doch beide, dass das niedere menschliche Wesen vor dem Monitor entscheidend ist.
-
Wenn du den String zusammenbauen willst, kann man dann in Java noch StringBuilder nehmen. Funktioniert genauso wie ein std::vector, man kann am Ende appenden und capacity vorgeben. Im Grunde nur ein Wrapper um ein dynamisches char-Array, auch leicht zum selber schreiben. Man kann diesen StringBuilder auch in Konkatenationen verwenden und in Streams schreiben, das könnte deinem vorletzten Beispiel entsprechen.
Ich sehe nicht, was man da noch groß einsparen kann.Wenn die Größe vorher bekannt ist, kann man auch gleich ein char[] nehmen und mit System.arraycopy() reinkopieren (spart Indexprüfung).
Dieses char[] kann man dann wie jeden String in Konkatenationen und Ausgaben verwenden.Ich könnte IMHO alle deine Beispiele nachbauen und frage mich immer noch, was das mit der verwendeten Sprache zu tun hat.

-
Entwickler schrieb:
Warum pusht eine Firma wie Oracle Java ohne Ende?
Warum pusht eine Firma wie IBM Java ohne Ende?
Warum pusht eine Firma wie SAP Java ohne Ende?
(alle drei würde ich zu absoluten Riesen im IT Bereich sehen)Warum entwickelt MS mit C# ein gegenstück zu Java?
Warum boomt J2EE ohne Ende?Warum pusht eine Firma wie Oracle VMWare, obwohl sie eigentlich kein Geld sparen, da sie kostenlose Linux-Versionen kriegen und nur Windows-Lizenzen erwerben müssen? Die VMWare soll nicht mal andere Prozessor-Typen emulieren!
Warum pusht eine Firma wie IBM Linux mit 1 Milliarde Dollar, obwohl ihre gesamte Software auf Windows läuft und für Mainframes/Cluster AIX zur Verfügung steht?
SAP pusht Java, damit MS mit C# kläglich untergeht und SAP nicht aufgekauft wird

Nur wenn man die Hintergründe kennt, kann man bestimmte Argumente auch Argumente sein lassen.
boomt java vielleicht nur, weil scrippt-kiddies schneller guis/"applets" schreiben können, als in c++? das klingt vielleicht nach einem totschlagargument, aber ich habe noch nie ein c++-einsteiger tut/buch gesehen, das einen gleich in gui-programmierung einführt, ganz im gegensatz zu java. und auch sonst hört man ja öfters, das gui mit java leichter sei...
mfg
-
Was ist daraus geworden?
Java hat im Webservices Bereich ziemlich alle anderen verdrängt, obwohl es langsamer ist als C oder C++! Warum? Es ist einfacher und die Firma spart Geld!
IBM stellt die gesamte Lotus/Domino Struktur auf Java um(Workplace). Warum? Weil die Kunden es wahrscheinlich möchten.
Oracle und SAP weiß ich nicht.
terraner schrieb:
java. und auch sonst hört man ja öfters, das gui mit java leichter sei...
Und genau darum werden sich diese Sprachen durchsetzen! Warum hat sich PHP gegen C/Perl im CGI Bereich durchgesetzt, obwohl es langsamer war/ist? Es ist einfacher und jeder kann es!
Warum hat sich Windows damals gegen Unix durchgesetzt? Es wurde anfangs von Guru's auch nicht für voll genommen, was ist daraus geworden?