[Perfromance Benchmark] Java - C++
-
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?
-
Optimizer schrieb:
So etwas kann ich selbstverständlich auch in Java schreiben.
ups, hab ich verpasst, daß operator overloading eingeführt wurde? wenn das der fall ist, kann man sich natürlich klassen schreiben, die man dann auch benutzen mag. oder man könnte auch die operatoren für die eingebauten typen wegmachen.
So etwas verursacht in Java mit Sicherheit auch keinen Overhead, der JIT-Compiler kann genauso Methoden inlinen und anderen Overhead sehe ich dort nicht.
kann sein. aber ich traue das java nicht fehlerfrei zu.
und das letzte beispiel verdeutlicht einfach nur die schlechtheit des tests. solche tests fordern doch nur herauf, daß man die compiler umstrickt, sodaß sie genau die testfälle erkennen und wegoptimieren.
-
Hallo,
wenn man die Aussage des Benchmarks, daß Java bei einigen Aufgaben schneller als C++ bzw. schneller als von üblichen C++ Compilern produzierter Code ist, entkräften möchte, dann sollte man vielleicht nicht gerade einen Teilbenchmark optimieren, bei dem C++ sowieso schneller ist. Es sollten eher die optimiert werden, bei denen die C++ Version langsamer ist.
-
Damit dürfte Java schnell genug sein... Passt auch zum Thema IBM und Java

http://www.heise.de/newsticker/meldung/46362
Irgendwann vielleicht auch erschwinglich für kleinere Firmen

-
volkard schrieb:
Optimizer schrieb:
So etwas kann ich selbstverständlich auch in Java schreiben.
ups, hab ich verpasst, daß operator overloading eingeführt wurde? wenn das der fall ist, kann man sich natürlich klassen schreiben, die man dann auch benutzen mag. oder man könnte auch die operatoren für die eingebauten typen wegmachen.
Wenn's dir um Operator-Overloading geht, dann nimm doch C#. Da haste das Gleiche in Grün und mit operator overloading. Aber ich sehe nicht, warum das dann abstrakter oder performanter ist? Denn das war doch das Thema.

So etwas verursacht in Java mit Sicherheit auch keinen Overhead, der JIT-Compiler kann genauso Methoden inlinen und anderen Overhead sehe ich dort nicht.
kann sein. aber ich traue das java nicht fehlerfrei zu.
Hmmmmm. Ich denke, dass du dem Hotspotter einiges zutrauen kannst. Ich würde nicht meine Hand darauf verwetten, dass so ne Methode beim ersten Kompilieren geinlined wird. Das Problem ist, dass nicht-statische und nicht-private Methode erstmal als virtuell gelten.
Aber wenn der Hotspotter sogar Variablen erkennt, die ihren Wert nicht mehr ändern, sie fest einkompiliert und dann die Stelle neu kompiliert, wenn sich der Wert nach 93846 Jahren doch geändert hat, dann darfst du ihm inlinen zutrauen, würde ich sagen.und das letzte beispiel verdeutlicht einfach nur die schlechtheit des tests. solche tests fordern doch nur herauf, daß man die compiler umstrickt, sodaß sie genau die testfälle erkennen und wegoptimieren.
Von dem Benchmark halte ich genauso wenig wie du. Ich habe mich nur gewundert, warum dass deiner Meinung in Java nicht möglich sein soll. Gerade Optimierungen auf Algorithmenebene (und das war das doch) sind doch in nahezu jeder Sprache umsetzbar.
Das ist doch so schön. Jeder darf in der Sprache coden, die ihm genehmer ist und ungefähr auf die gleiche Performance kann er doch noch kommen. Ein HashSet ist und bleibt ein HashSet, auch wenn's in Java gecodet ist.
Dann gibt's halt Dinge, wo man in C++ mehr Möglichkeiten hat. Dann gibt's noch Dinge, wo man in C++ mehr Aufwand investieren muss, um die selbe Funktionalität zu erhalten. Dann gibt's sogar Dinge, wo man in C++ mehr Aufwand investieren muss, um die selbe Performance zu erhalten (z.B. Allokatoren). Ist halt immer unterschiedlich, aber am meisten hängt's halt doch vom Programmierer ab.
Java macht mir halt das Leben leichter und ich kann mehr über meine Algorithmen nachdenken. Weil wenn ich statt
for( std::vector<Foo*>::const_iterator i = myVector.begin(); i != myVector.end(); ++i ) (*i)->methode();folgendes habe:
for( Foo x : myVector) x.methode();kann ich mich leichter auf's Wesentliche konzentrieren. Das soll jetzt nur als Beispiel dienen und nicht aufzeigen, dass ich mit obigen C++ Code überfordert bin. Aber ich bin halt trotzdem nur ein Mensch.
Und weil es so viele Menschen auf dieser Welt gibt, gibt es noch andere Sprachen als C++.
