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; } }