BCB vs VC++,C#,Delphi ----> Java doppelt so schnell wie C++ ?



  • 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 + bla

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



  • Gregor schrieb:

    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.

    Argh, der Beitrag enthält J2EE.

    J2EE ist wiederrum ein anderes Gebiet, natürlich ist korrekte Programmierung
    von skaalierbaren J2EE Anwendungen nicht von weniger erfahrenen Programmierern möglich.

    Lass uns in dem Umfeld bei J2SE bleiben 😉


Anmelden zum Antworten