Welche Programmiersprache für das internet
-
@Gregor
was ist den 32MB groß, doch nicht das Executable? Naja bei mir sieht es so auskingruedi@host1# g++ -O3 -Wall -W -march=athlon -mcpu=athlon -fomit-frame-pointer -malign-double -fschedule-insns2 -pipe -std=c++98 -o benchmark benchmark.cc kingruedi@host1# ./benchmark 0 1 2 3 4 5 6 Array erzeugen : 0ms Zufallszahlen erzeugen : 1310000ms Sortieren : 1740000ms String (anhängen) : 2740000ms Speichern : 1050000ms Wurzeln berechnen : 210000ms kingruedi@host1# ls -lh benchmark -rwxr-xr-x 1 king king 58k Oct 26 00:21 benchmark
58kb vs. 32mb schon nen kleiner Unterschied
-
Original erstellt von kingruedi:
**@Gregor
was ist den 32MB groß, doch nicht das Executable? Naja bei mir sieht es so aus
**Nein! Die erzeugte Text-Datei! ...ist doch ein Indiz dafür, dass was mit dem String nicht stimmen kann, wenn meiner 20 MB länger ist, oder? ...bei mir ist der Code übrigens ansonsten tatsächlich deutlich flotter beim String-erzeugen, als die anderen C++-Programme. ...das Speichern ist aber noch nicht optimal, aber da müßte ich meinen Rechner mal neu starten, um das tatsächlich beurteilen zu können!
-
@Gregor:
Jep, sorry mein Fehler. Die <strstream> Header sollte man nicht mehr verwenden - hab nur vergessen den include wieder rauszunehmen... ich verwende eh nichts aus strstreamdann erklaer mal, was mein programm falsch macht!
OK, ich habe insofern nen kleinen Bug, als dass meine int2str Funktion aus der Zahl 0 einen leerzen string macht...
Wenn ich mir die datei aber ansehe: dann habe ich exakt 5000001 Zeilen und in 5000000 Zeilen steht eine zahl (die ersten paar zeilen ausgenommen, da sollte 0 stehen, tut es aber nicht).
Wie sieht die Ausgabe in Java aus? vielleicht
00001
00002
00003oder warum ist deine Datei groesser
-
Hmmm... ich weiß nicht, wo der Fehler liegt. Was ist denn die größte Zahl, die erzeugt wird? Bei mir ist es (bei dem Java-Programm) 2 Mrd. und etwas. ...und die kleinste -2 Mrd und etwas, aber das mit den negativen Zahlen ist egal, das macht nicht soviel aus. führende Nullen schreibe ich auch nicht mit.
[ Dieser Beitrag wurde am 25.10.2002 um 22:44 Uhr von Gregor editiert. ]
-
OK, Bug ist behoben:
int2str ist leicht geaendert worden:void int2str(int num, char* buffer) { char* t=buffer; if(num==0) { *buffer++='0'; *buffer=0; return; } i2s(num,t); *t=0; }
Schoen wenn du handoptimiert schneller bist als ich aber ich habe einfach nicht die lust mich wirklich hinzusetzen und zu sagen, ich schreib die ganzen sachen haendisch...
int2str musste ich haendisch schreiben, da die streams anscheinend verdammt lahm sind
-
Original erstellt von Shade Of Mine:
**
Schoen wenn du handoptimiert schneller bist als ich aber ich habe einfach nicht die lust mich wirklich hinzusetzen und zu sagen, ich schreib die ganzen sachen haendisch...
**Ja, das ist ein echter Nachteil von Java. Viele Dinge sind so, wie sie vorgegeben sind einfach langsam. ...ist schon merkwürdig, dass man so einfach z.B. ein Sort schreiben kann, was schneller, als das vorgegebene ist. ...der Zufallsgenerator wird ein noch extremeres Beispiel sein.
Naja : Einige Sachen sind auch schnell!
-
Original erstellt von Gregor:
Hmmm... ich weiß nicht, wo der Fehler liegt. Was ist denn die größte Zahl, die erzeugt wird?Da haben wir das problem!
bei mir ists 0 bis 32767Muesste man mal um faktor 68 erweitern - dann sollte es ungefaehr hinkommen...
-
Original erstellt von Gregor:
Viele Dinge sind so, wie sie vorgegeben sind einfach langsam.Ist in C++ genauso... zB stringstream - das war n schock fuer mich, dass das so lahm ist... naja...
Wir testen hier auch extremfaelle die nie wirklich vorkommen werden - deshalb sind die ergebnise ja auch verfaelscht...
-
Ich habe die Zufallszahlen jetzt mal mit 68 multipliziert. -> 41 MB! Langsam kommen wir dem Ziel näher!
...bei mir kommt jetzt eine ähnliche Performance zum Java-Programm heraus, was die Strings betrifft. ...bei allem, was davor ist, ist C++ schneller, beim Speichern wieder langsamer! Wurzeln sind wieder gleich. Es wundert mich, dass Java hier so gut abschneidet.
-
Ich denke eh, dass wir noch 3 Dinge in den Test mit einbeziehen sollten, wo ich mir aber eh sicher bin, dass C# und Java verlieren
1. Gesamt Dauer des Programmes (C# und Java haben den Nachteil, dass das Jitten noch dazu kommt)
2. Speicher Bedarf der Binarys (bei C# und Java kommt noch die VM+Jitter hinzu, also wird das deutlich größer)
3. Arbeitsspeicher Bedarf (ich denke C# und Java haben da schlechte Karten, wegen der VM, die ja noch geladen werden muss)
-
Bei den Binaries würde ich die JVM bzw. das Framework nicht mitzählen. Die sind ja generell da und haben erstmal nichts mit dem eigentlichen Programm zu tun. ...da kann man ja gleich das ganze Betriebssystem mitzählen. ...oder man baut sich ne GUI und rechnet bei C++ irgendeine Grafikbibliothek dazu. sollte nicht kleiner als bei Java sein. Wenn man nur die kompilierten Programme betrachtet, dann ist C++ für Java, was die Größe betrifft kein Gegner. Bei C# weiß ich das nicht. Aber beim benötigten Arbeitsspeicher hat C++ einen deutlichen Vorteil. Bei der Gesamtlaufzeit kannst du beim Java-Programm noch maximal eine Sekunde draufrechnen. Länger dauert das nicht.
...ich bin ja froh, dass ihr nicht nen fiesen Test vorgeschlagen habt, wie :
"Wir schreiben 25.000.000 ints in eine Hashtabelle!" ...da hätte Java bei weitem keine Chance! ...würde wahrscheinlich sogar nen Faktor 100 oder so ausmachen, weil ich für das Java-Programm nicht genug Arbeitsspeicher gehabt hätte.
-
Und was sagt einem das Ergebnis? Das so ein Test nichtmal annähernd auf Real-World Situationen übertragbar ist war ja schließlich hoffentlich vorher allen beteiligten klar.
[Edit: der Fhelerteufel hat ein Wort geklaut]
[PS: Nebenbei gesagt ist das ein ziemlich armer Test. Wer Programmiersprachen mittels Fortran-Programmen vergleicht muß sich nicht wundern, wenn Sprachen, die sich am Geist von Fortran orientieren, am besten abschneiden][ Dieser Beitrag wurde am 25.10.2002 um 23:35 Uhr von Bashar editiert. ]
-
Original erstellt von <->:
dimah: schonmal was davon gehört das der stack nicht unendlich groß ist?hab zwar nich den ganzen thread glesen, aber: static ?
-
Original erstellt von Bashar:
Und was sagt einem das Ergebnis? Das so ein Test nichtmal annähernd auf Real-World Situationen übertragbar ist war ja schließlich hoffentlich vorher beteiligten klar.Logo.
Aber wenn jemand behauptet Java ist schneller als C++, dann setz ich mich hin und schreib ein C++ programm das schneller ist - egal unter welchen bedingungen
-
Original erstellt von Shade Of Mine:
[quote]Original erstellt von Bashar:
[qb]
Aber wenn jemand behauptet Java ist schneller als C++, dann setz ich mich hin und schreib ein C++ programm das schneller ist - egal unter welchen bedingungenDann bist du ja noch nicht fertig! :p ...du vergißt die Speicherperformance, und die richtige Dateigröße.
Die String-Geschichte hat sicherlich nichts mit der realen Welt zu tun, aber 5000000 Wurzeln hintereinander berechnen kann durchaus vorkommen.
EDIT : Ich habe aber nicht behauptet, dass Java schneller als C++ ist. Zumindest wollte ich das nicht, falls es so rübergekommen ist. Aber Java ist nicht sooo viel langsamer.
[ Dieser Beitrag wurde am 25.10.2002 um 23:35 Uhr von Gregor editiert. ]
-
wie wärs mit einem programm das ein mandelbrot approximiert und in ne .bmp datei schreibt dann gibt es auch mit der grösse kaum ein problem...
-
Original erstellt von japro:
wie wärs mit einem programm das ein mandelbrot approximiert und in ne .bmp datei schreibt dann gibt es auch mit der grösse kaum ein problem...Bitmap finde ich doof! ...aber gegen eine PNG Datei hätte ich nichts einzuwenden. Ich würde das Java-Programm aber nichtmehr heute schreiben.
-
Original erstellt von Bashar:
**
PS: Nebenbei gesagt ist das ein ziemlich armer Test.
**Jo! Stimmt! Ich habe mich, als ich das Programm geschrieben habe, mal ne Viertelstunde hingesetzt und halt irgendeinen Unsinn programmiert. Ich habe mir dabei nichts gedacht! Trotzdem finde ich das Ergebnis bisher schon recht interessant.
-
Ich habe jetzt übrigens mal etwas anderes bei den Zufallszahlen gemacht. Bei mir steht da jetzt :
array[i]=(rand() << 16)+rand();
Das Ergebnis ist eine Datei, die etwa 3,5 MB zu groß ist, ich weiß aber nicht, warum.
Die Ergebnisse sehen etwa wie folgt aus :
1,2 GHz
Sortieren : 1,5s
String : 4s
Speichern : 12s
Wurzel : 0,2s1,6 GHz
Sortieren : 1,1s
String : 3s
Speichern : 8s
Wurzel : 0,15s
-
also was braucht man für ein C++ Programm welches Java weit hinter sich läst,
- Variablen auf den Stack
- wenig Hot Spots (also bitte nicht 10000000 mal das gleiche hinter einander)
- ein paar Klassen im Container (Java muss da immer dynamisch casten so weit ich weiß)
- ein test der die komplette Zeit berücksichtigt (obwohl mir das egal ist wenn ein Java Programm 3 mal so lange brauchen würde um zu Starten)
- eine gute STL Implementierung
bitte ergänzt weiter