Hallo zusammen, zur Zeit arbeite Ich mich in C# ein und habe dabei eine interessante Entdeckung gemacht: C# eralubt die Definition von "value"-Typen (Schluesselwort struct), welche effiziente Arrays von Objekten (und nicht nur Zeiger-Arrays wie bei Java) ermoeglichen. Zudem koennen Value-Objekte auf dem Stack allokiert werden, was natuerlich auch erheblich schneller ist als per new. Meinen Benchmarks nach ist ein struct-Array in C# praktisch so schnell wie ein C++ Array. Um einem Flamewar gleich vorzubeugen: C# gibt es auch auf Linux, MacOS X, BSD und vielen anderen Unices (das mono-Projekt) und man hat fuer GUI-Anwendungen die Wahl GTK oder Windows Forms (auch auf Linux) zu benutzen. Mein bisheriger Eindruck von mono ist durchweg positiv.
Attached sind noch meine Performance-Benchmarks.
Gruss
Frank
On Dec 15, 2007 4:08 PM, Frank Gerlach frankgerlach@gmail.com wrote:
zur Zeit arbeite Ich mich in C# ein und habe dabei eine interessante Entdeckung gemacht: C# eralubt die Definition von "value"-Typen (Schluesselwort struct), welche effiziente Arrays von Objekten (und nicht nur Zeiger-Arrays wie bei Java) ermoeglichen.
Du solltest nicht Kürbisse mit Bananen vergleichen. Es gibt auch für Java Alternativen, Beispiel:
Package: libtrove-java Description: high performance collections for java GNU Trove is a fast, lightweight implementations of the java.util Collections API. These implementations are designed to be pluggable replacements for their JDK equivalents. . Whenever possible, GNU Trove provide the same collections support for primitive types. This gap in the JDK is often addressed by using the "wrapper" classes (java.lang.Integer, java.lang.Float, etc.) with Object-based collections. For most applications, however, collections which store primitives directly will require less space and yield significant performance gains.
Viele Grüße, Torsten
Torsten Werner schrieb:
On Dec 15, 2007 4:08 PM, Frank Gerlach frankgerlach@gmail.com wrote:
zur Zeit arbeite Ich mich in C# ein und habe dabei eine interessante Entdeckung gemacht: C# eralubt die Definition von "value"-Typen (Schluesselwort struct), welche effiziente Arrays von Objekten (und nicht nur Zeiger-Arrays wie bei Java) ermoeglichen.
Du solltest nicht Kürbisse mit Bananen vergleichen. Es gibt auch für Java Alternativen, Beispiel:
Package: libtrove-java
Also Bananen sind im Gegensatz zu Kürbissen wirklich lecker und auch nicht so sperrig. Dafür werden von Kürbissen mehr Leute satt.
Oder anders ausgedrückt: C# macht das builtin, Java braucht einen Zusatz. Der Vergleich war also nicht so verkehrt.
Ineressant wären ja mal die konkreten Zahlen gewesen.
Gibt es eigentlich sonst irgendwo brauchbare Performance-Tests zu mono und Java?
Viele Grüße Eric
Hallo,
Du solltest nicht Kürbisse mit Bananen vergleichen. Es gibt auch für Java Alternativen, Beispiel:
Package: libtrove-java
Wenn ich das richtig verstehe ist das kein Ersatz fuer beliebige, kompakte Datenstrukturen, wie durch C# struct moeglich.
Oder anders ausgedrückt: C# macht das builtin, Java braucht einen Zusatz. Der Vergleich war also nicht so verkehrt.
Ineressant wären ja mal die konkreten Zahlen gewesen
Ich habe mein Testcase nochmal ueberarbeitet, und die Allokation der Arrayelemente aus dem Benchmark (weitestgehend) herausgenommen. Dann ergeben sich folgende Zahlen: C++: 11.44s (g++ -O2) Java: 15.78s (gcj -O2) C#:12.32s (mcs -optimize)
Wie man sieht sind die Unterschiede also gar nicht mehr so signifikant. ALLERDINGS: Dieser Benchmark tested die Allokation der Arrayelemente praktisch nicht. Wenn man dies tun wuerde, waere Java sicher um den Faktor 3-4 langsamer.
//java class StructTest{
static class TestStruct{ public double x; public double y; public double z; } public static void main(String[] argv){ int sz=10000000; TestStruct tsArray[]=new TestStruct[sz]; for(int i=0;i<sz;i++)tsArray[i]=new TestStruct(); for(int j=0;j<10;j++){ for(int i=0;i<sz;i++){ tsArray[i].x=i/12.3; tsArray[i].y=i/11.3; tsArray[i].z=i/15.3; } double sum=0.0; for(int i=sz-1;i>0;i--){ double x=tsArray[i].x; double y=tsArray[i].y; double z=tsArray[i].z; sum+=Math.sqrt(x*x+y*y+z*z); } System.out.println("sum:"+sum); } } }
//C# using System;
struct TestStruct{ public double x; public double y; public double z; }
class StructTest{ public static void Main(){ const int sz=10000000; TestStruct[] tsArray=new TestStruct[sz]; for(int j=0;j<10;j++){ for(int i=0;i<sz;i++){ tsArray[i].x=i/12.3; tsArray[i].y=i/11.3; tsArray[i].z=i/15.3; } double sum=0.0; for(int i=sz-1;i>0;i--){ double x=tsArray[i].x; double y=tsArray[i].y; double z=tsArray[i].z; sum+=Math.Sqrt(x*x+y*y+z*z); } System.Console.Write("sum:"+sum+"\n"); } } }
//C++
#include <math.h> #include <iostream>
using namespace std;
class TestStruct{ public: double x; double y; double z; };
int main(char** argv){ const int sz=10000000; TestStruct* tsArray=new TestStruct[sz]; for(int j=0;j<10;j++){ for(int i=0;i<sz;i++){ tsArray[i].x=i/12.3; tsArray[i].y=i/11.3; tsArray[i].z=i/15.3; } double sum=0.0; for(int i=sz-1;i>0;i--){ double x=tsArray[i].x; double y=tsArray[i].y; double z=tsArray[i].z; sum+=sqrt(x*x+y*y+z*z); } cout<<"sum:"<<sum<<endl; } }
Du solltest nicht Kürbisse mit Bananen vergleichen. Es gibt auch für Java Alternativen, Beispiel:
Package: libtrove-java
Wenn ich das richtig verstehe ist das kein Ersatz fuer beliebige, kompakte Datenstrukturen, wie durch C# struct moeglich.
Die Idee an Trove ist, dass es versucht, eine schnellere Version von weit verbreiteten Datenstrukturen wie Hash, List, Stack usw. ("Set") zu liefern. So was wie Hash, List oder Stack ist natuerlich alles andere als "beliebig". Zusammengesetzte Datentypen ala C struct hat java ja schon selber, das ist Teil von "class".
Oder anders ausgedrückt: C# macht das builtin, Java braucht einen Zusatz. Der Vergleich war also nicht so verkehrt.
Die "normale" Implementation von Hash, List, Stack usw. in java sind genauso nur "zusaetzliche" Klassen/Methoden wie die Trove API. Inwieweit man das als "Zusatz" sieht, haengt an der Definition, wie weit man "java" interpretiert: Allein als Programmiersprache oder als das auf den Java-Bytecode aufbauendes System. Da es auch so was wie java nach C Uebersetzer gibt, kann man ueber java als Programmiersprache nicht allzuviel sagen (ausser dass es einen Garbagekollektor braucht, was unter Umstaenden Auswirkungen auf die Performance hat).
so long MUFTI
Hab zwar zu dem Thema nix beizutragen, aber du solltest mal deine Systemuhr stellen, die verschickst Mails von gestern (im Ernst)
MfG Thomas
Joerg Scheurich aka MUFTI schrieb:
Du solltest nicht Kürbisse mit Bananen vergleichen. Es gibt auch für Java Alternativen, Beispiel:
Package: libtrove-java
Wenn ich das richtig verstehe ist das kein Ersatz fuer beliebige, kompakte Datenstrukturen, wie durch C# struct moeglich.
Die Idee an Trove ist, dass es versucht, eine schnellere Version von weit verbreiteten Datenstrukturen wie Hash, List, Stack usw. ("Set") zu liefern. So was wie Hash, List oder Stack ist natuerlich alles andere als "beliebig". Zusammengesetzte Datentypen ala C struct hat java ja schon selber, das ist Teil von "class".
Oder anders ausgedrückt: C# macht das builtin, Java braucht einen Zusatz. Der Vergleich war also nicht so verkehrt.
Die "normale" Implementation von Hash, List, Stack usw. in java sind genauso nur "zusaetzliche" Klassen/Methoden wie die Trove API. Inwieweit man das als "Zusatz" sieht, haengt an der Definition, wie weit man "java" interpretiert: Allein als Programmiersprache oder als das auf den Java-Bytecode aufbauendes System. Da es auch so was wie java nach C Uebersetzer gibt, kann man ueber java als Programmiersprache nicht allzuviel sagen (ausser dass es einen Garbagekollektor braucht, was unter Umstaenden Auswirkungen auf die Performance hat).
so long MUFTI
On Fri, December 21, 2007 17:38, Thomas Lindner wrote:
Hab zwar zu dem Thema nix beizutragen,
Dann trag' bitte auch nix bei! ;-)
aber du solltest mal deine Systemuhr stellen, die verschickst Mails von gestern (im Ernst)
1. es ist relativ normal dass Mails einige Stunden oder sogar 1-2 Tage Verzögerung haben.
2. gibt es nicht nur eine Zeitzone (ich bin z.B. gerade 7 Zeitzonen-Stunden von Dir entfernt - Du siehst es nur nicht an meiner Mail, weil ich zufällig einen Webmailer mit deutscher Zeit benutze).
3. bleiben Mails manchmal im Filter hängen und müssen vom Moderator (z.B. mir) "befreit" werden. Das dauert schonmal ein Weilchen. Insb. wenn der Moderator auf einem anderen Kontinent ist. Hier war das der Fall.
Kurz: wenn Du Zeitvergleiche mit eMail machen willst kannst Du auch gleich auf eine Uhr verzichten - wahrscheinlich wird es dann genauer!
Konrad
Konrad Rosenbaum schrieb:
- gibt es nicht nur eine Zeitzone (ich bin z.B. gerade 7
Zeitzonen-Stunden von Dir entfernt - Du siehst es nur nicht an meiner Mail, weil ich zufällig einen Webmailer mit deutscher Zeit benutze).
Sorry, wusste ich nicht, ich dachte im Header stehen UTC Angaben, die mein Mailer automatisch "korrogiert"
- bleiben Mails manchmal im Filter hängen und müssen vom Moderator (z.B.
mir) "befreit" werden. Das dauert schonmal ein Weilchen. Insb. wenn der Moderator auf einem anderen Kontinent ist. Hier war das der Fall.
Kurz: wenn Du Zeitvergleiche mit eMail machen willst kannst Du auch gleich auf eine Uhr verzichten - wahrscheinlich wird es dann genauer!
Völlig korrekt, auf meine Uhr will und werde ich nicht verzichten. Mich störte nur, dass ungelesene Sachen irgendwo ganz weit oben in der Liste auftauchen, wie dass gewöhnlich nur bei Spam üblich ist. Nochmal Sorry
MfG und Frohe Weihnachten Thomas
Ich habe mein Testcase nochmal ueberarbeitet, und die Allokation der Arrayelemente aus dem Benchmark (weitestgehend) herausgenommen.
???
//java
...
int sz=10000000; TestStruct tsArray[]=new TestStruct[sz];
Hier werden die Arrayelemente doch alloziert ?
so long MUFTI
lug-dd@mailman.schlittermann.de