BCB vs VC++,C#,Delphi ----> Java doppelt so schnell wie C++ ?
-
-
kingruedi schrieb:
lass mich raten, wenn ich jetzt sage, dass Java Applikationen viel RAM verbrauchen, dann kann ich mir von dir anhören, dass das einfach daran liegt, wie Java Programmierer denken und die lieber ein sauberes Programm schreiben, anstelle RAM zu sparen?
Was das RAM betrifft, bringt Java von sich aus einen sehr großen Overhead mit. Das stimmt und das ist sicherlich auch ein Nachteil von Java.
Warum sollte jemand anders Java als C++ programmieren?
Weil sonst soetwas herauskommt, wie bei diesem Benchmark. Das C++-Programm ist dann einfach lahm!
-
@Mod: Mach hier zu..
2 verschiedene Themen - 2 verschiedene Threads
-
in welchem Punkt ist das Thema anders?
naja, ist mir egal. Dann lasst ihn hat auf. Das stört mich doch nicht...
-
AndreasW schrieb:
in welchem Punkt ist das Thema anders?
In diesem Thread geht es in erster Linie um den c't-Benchmark. Im anderen Thread wurde der eigentlich nur mal so am Rande ewähnt.
-
Das Programm ListList_BCB_VU6 hat wohl ein Delphianer geschrieben
Schon alleine das Umschreiben folgender Zeilen der Routine BuildListList genügte schon, um die Laufzeit des Programms (bBenchCreate (1 Mio Calls)) deutlich zu beschleunigen.Ursprüngliche Codezeilen, Time 23:684
NewName=""; for(int y=1; y<=NameLength; y++) NewName = NewName + char((int)'a' + (rand() % 26));
Modifizierte Codezeilen, Time 10:385
NewName.SetLength(NameLength); for(char *p=NewName.c_str(), y=1; y<=NameLength; y++) *p=char((int)'a' + (rand() % 26));
Die Zeiten wurden auf meinem System Pentium 800MHZ gemessen.
-
Peter, ich glaube dein Code ist illegal.
Du darfst den von c_str zurückgegebenen Zeiger nicht beschreiben.
-
Eigentlich sollte es schon einiges bringen einfach statt NewName = NewName + blablabla
NewName += blablabla zu schreiben.
Und wenn man wie in diesem Fall weiß wie groß der string mal wird sollte man den Speicher auch im Voraus reservieren. Das spart wertvolle Rechenzeit.
Btw:
Das beschreiben des von c_str zurückgegebenen Strings ist wirklich verboten.MfG Jester
-
Du darfst den von c_str zurückgegebenen Zeiger nicht beschreiben
Aja, man darf also nicht dürfen. Komisch, ich hatte noch garnieüberhauptnicht Probleme damit (man muß halt ein bisserl aufpassen)
Aber wenn ihr meint
. Keiner kann Euch die Benutzung von Pointern aufzwingen, aber dann wäre es vielleicht sinnvoller Delphi zu verwenden. Da ist ein String ein richtiger Datentyp und keine Klasse ....
Ob man nun NewName += "Blabla" oder NewName = NewName + "Blabla" schreibt ist doch nun wirklich vollkommen egal !
-
Peter schrieb:
Aja, man darf also nicht dürfen. Komisch, ich hatte noch garnieüberhauptnicht Probleme damit (man muß halt ein bisserl aufpassen)
Aber wenn ihr meint
.
Da hat doch vor einiger Zeit jemand genauso argumentiert...
Spieleprogrammierer hat der sich genannt, IIRC.
-
Ob man nun NewName += "Blabla" oder NewName = NewName + "Blabla" schreibt ist doch nun wirklich vollkommen egal !
Kurz gesagt: Du hast keine Ahnung.
-
Da hat doch vor einiger Zeit jemand genauso argumentiert
Hab ich nicht mitbekommen. Es ist aber in der Tat so, wenn man rein nur String/AnsiString verwendet, kann die Anwendung langsam werden. Schaut man sich nur mal im Debugger an was passiert, wenn man ein Zeichen des Strings mit [] modifiziert, versteht man warum das so ist.
Hoffe es geht deswegen nicht wieder rund hier
-
@Anja
Okay okay, in diesem Punkt habe ich mich geirrt. Hab mich gerade davon überzeugt. Danke für Deinen Hinweis
-
Peter schrieb:
Hab ich nicht mitbekommen.
Sei froh. Dieser Spieleprogrammierer hat seine seltsamen Ansichten darüber, was richtiger Code ist, grundsätzlich damit begründet, dass das "bei ihm so funktioniert". Er wollte nicht einsehen, warum das kein Argument ist. Am Ende wurde ihm eine verdiente Merkbefreiung ausgestellt.
Schaut man sich nur mal im Debugger an was passiert, wenn man ein Zeichen des Strings mit [] modifiziert, versteht man warum das so ist.
Es ging um Schreibzugriffe über den Zeiger, den c_str() liefert. Der ist ein Zeiger auf const char. Du hast das const einfach weggecastet, und dann reingeschrieben. Das erzeugt undefiniertes Verhalten. Es ist schön für dich, dass dein Compiler da mitspielt, aber das macht den Code nicht besser.
-
Jester schrieb:
Eigentlich sollte es schon einiges bringen einfach statt NewName = NewName + blablabla
NewName += blablabla zu schreiben.
? Wieso?
Jester schrieb:
Und wenn man wie in diesem Fall weiß wie groß der string mal wird sollte man den Speicher auch im Voraus reservieren. Das spart wertvolle Rechenzeit.
Das sttimmtund gilt speziell auchfür STL-Container.
-junix
-
@junix
Hab das str+="blabla" und str=str+"blabla" im Debugger angeschaut, es gibt in diesem Fall (AnsiString) tatsächlich einen großen Unterschied. Gucks Dir einfach mal an ....
-
Naja, mit += hänge ich den aktuellen String dran.
Mit String = String + blaerzeuge ich zunächst einen temporären String, der String + bla enthält und rufe anschließend den operator= des String auf.
Ich hab jetzt auch mal ein bissel damit rumgespielt:
Gesamtlaufzeit Originalcode: 2:39,6, nachdem ich ihn überarbeitet hatte: 27.6
Und lange hab ich dazu nicht gebraucht.Nochmal was zur Vergleichbarkeit: Klar ist es nicht nötig das alles 100% zu optimieren. Aber der Code sollte schon Vergleichbar sein, und nur weil er syntaktisch sehr ähnlich ist ist er eben nicht unbedingt auch semantisch sehr ähnlich.
public void Process(String Text);
ist in Java eben eine Übergabe per Referenz.
void Process(std::string Text); sieht zwar sehr ähnlich aus, kann aber was die Performanz betrifft selbstverständlich nicht mithalten.
Deshalb muß, damit man überhaupt vergleichen kann daraus auch ein
void Process(const std::string & Text) werden, wenn nichts triftiges dagegen spricht. Insofern halte ich die verschiedenen Programme keineswegs für vergleichbar. Aber wenn man natürlich sagt zwei Programme sind vergleichbar, wenn sie nru minimale syntaktische Unterschiede aufweisen... dann... ja, dann könnte es hinkommen.MfG Jester
-
Übrigens, für alle denen die Pointerei in einen AnsiString missfällt, so ungefähr gehts natürlich auch, ganz ohne AnsiGedöns:
char *NewName=new char[NameLength+1]; for(p=NewName, y=1; y<=NameLength; y++, p++) *p='a' + (rand() % 26); *p=0;
Entsprechende Deklarationen nicht vergessen, vor allem nicht das Freigeben von NewName am Ende der Routine.
Der Kreativität sind keine Grenzen gesetzt
-
Benchmarks sind zum grössten Teil Quatsch, denn sie gehen
an der Realität vorbei.Mann sieht es z.b an der Art wieviel mann schneller dieses oder
jenes implementieren kann.Ich gehöre zu der Java Seite und habe nicht viel Ahnung von C++ aber
wenn ich sehe das mann lieber cout << nutzen sollte um hier und
da noch zu beschleunigen, oder in Java mann lieber seine LinkedList
selber implementiert um hier und da noch ein fünkchen Zeit rauszuholen,
oder nicht die Methode sort bei Collectionen nutzt, die das gewünschte
Ergebnis zwar liefert, aber für ein Benchmark lieber ein eigener
Sotieralgorythmus geschrieben wird, dann geht das um weiten an dem
Vorbei wofuer die Programmiersprache genutzt wird.Ich nutze weiterhin [Collection].sort(); auch wenn sie eventuell
etwas langsamer ist.
Mein Chef würde mir was husten, wenn ich die Entwicklungszeit eines
Projektes verdreifache nur um im Endeffekt nochmal 10% Performance
rauszukitzeln.
Zudem wird mein Programm, umso mehr ich eigene Algorythmen darin platziere
und von dem gebotenen abweiche, schwerer wartbar.
Besonders dann wenn sich irgend ein armer Hund, noch in meine Algorythmen einarbeiten muss, nur um zu verstehen was ich damit erreichen will.Selbst wenn Java ein bischen langsamer als C++ ist (und ich glaube
auch als Java Programmierer nicht an diesen ct Benchmark) so ist
das ziemlich schnuppe.
Die Geschwindigkeitsgrenzen sind nur in mannchen Teilbereichen
der Entwicklung spürbar.
So ist und bleibt C(++) eher die Wahl dafür den letzte Tick an
Frameraten herauszuholen.
Wenn ich Kundendaten mit einen Suchalgorythmus durchsuche und
dieser statt nach 0,3 sec nach 0.45 sec durchläuft ist dann macht
das in der Usability des Programmes nicht viel aus.Genauso wie Programmiersprachen ihre Stärken haben, haben sie ihre
Schwächen.
So sehe ich (was andere wieder anders sehen) Swing als Schwäche Javas
an. Swing ist u.a dafür verantwortlich das viele die es einfach nicht
besser wissen, Java für langsam halten. Deshalb nutze ich lieber
SWT und JFace (Eclipse).
Swing ist zwar was die MVC Umsetzung angeht, und die Programmierbarkeit
in meinen Augen um einiges freundlicher als alles was ich davor kennengelernt
habe (inc. Qt, GTK) aber dennoch sehr gewöhnungsbedürftig was das "Feeling"
angeht. Dazu hat sich aber nach meiner Erfahrung herausgestellt das mann
sich an Swing GUIs gewöhnen kann, und einem die Performance immer weniger
stört. Auch verspricht, und scheint es auch zu halten (meinen bescheidenen
pers. Tests nach), Java 1.5 dort einige Verbesserrungen.
Dennoch sehe ich einen anderen grossen Vorteil von Java, das ist die
verrringerte Entwicklungszeit.
Ja ich traue einigen guten C++ Programmierern zu das sie auch in grossen
Projekten sämmtliche wilden Pointer verhindern zu wissen. Das es bei ihnen
nicht vorkommt das schwer zu findende Laufzeitfehler, auf grund der komplexität von C++, auftreteten.
Das Problem ist, das Firmen erstmal diese Menge an guten C++ Programmierern
finden und dann auch noch bezahlen müssen. Mitarbeiter mit einer solchen Erfahrung und Kompetenz sind relativ rar und teuer.
(Oh Gott hoffentlich dreh ich mir jetzt nicht selbst ein Strick :D) In Java ist es auch weniger erfahrenen Mitarbeitern möglich produktiv für die Firma
zu sein. Die Entwicklungskosten & Zeit vermindert sich.Im übrigen, sorry das ich einen so alten Thread rauskrame, aber ich bin darauf gestossen und meine Meinungsaustauschdrang hält sich nicht an Alte/Neue Threads.
-
tom schrieb:
Auch verspricht, und scheint es auch zu halten (meinen bescheidenen
pers. Tests nach), Java 1.5 dort [Swing] einige Verbesserrungen.[...]
(Oh Gott hoffentlich dreh ich mir jetzt nicht selbst ein Strick :D) In Java ist es auch weniger erfahrenen Mitarbeitern möglich produktiv für die Firma
zu sein.1. Ich habe vor einiger Zeit auch ein paar ganz simple Performance-Tests mit der Java 1.5-beta-1 Version gemacht und kann eigentlich nur bestätigen, dass Swing schneller und auch schöner geworden ist. Der Start von Programmen läuft jetzt auch merklich schneller ab. Allerdings sollte man gerade die Performance von Beta-Versionen nicht beurteilen. Es kommt darauf an, wie sich die finale Version verhält.
2. Autsch. ...naja, auch wenn ich Java gegenüber anderen Programmiersprachen bevorzuge, möchte ich euch diesen Link nicht vorenthalten.
...und hier ist die zugehörige Javalobby.org-Diskussion.