Java vs. C#



  • Original erstellt von kingruedi:
    **
    Naja zumindest sollten wir mal JDK 1.4, Mono und dotNET von der Geschwindigkeit vergleichen, in dem wir ein paar schöne Algorithmen oder so was auf C# und Java portieren (natürlich sollten wir ein C++ Programm als Referenz Wert nehmen, damit man sich etwas drunter vorstellen kann).**

    Au ja! Wenn sich einer findet, der Aufgaben stellt und einer, der das in C# (auch auf Mono lauffähig) implementiert, dann würde ich es in Java implementieren. (...zumindest soweit ich dazu fähig bin)



  • also ich kann kein C# und will es in der nächsten Zeit auch nicht lernen. Ansonsten würde ich das gerne machen. Wir sollten uns aber mal einen Algorithmus aussuchen, der Rest passiert ja fast von selbst ;), vorallem wenn C# und Java wirklich so ähnlich sind.



  • Ich wäre dafür, ganz atomare Dinge zu testen, obwohl die natürlich nicht unbedingt eine große Aussagekraft haben.

    Also sowas wie...

    ...10.000.000 Wurzeln ausrechnen.
    ...10.000.000 "a" an eine Zeichenkette anhängen.
    ...10.000.000 Zeilen auf der Konsole ausgeben.
    ...10.000.000 ints sortieren.
    ...10.000.000 Objekte erzeugen.
    ...10.000.000 mal ein Element an eine Liste anhängen.

    [ Dieser Beitrag wurde am 03.10.2002 um 22:37 Uhr von Gregor editiert. ]



  • @ kingruedi : Du kannst ja das C++ Referenzprogramm schreiben.



  • Original erstellt von kingruedi:
    **Ich hab gelesen (irgend wo bei Slashdot oder Heise), dass die Mono Entwickler eher eine bessere Alternative zu den WinForms suchen würden, da diese wohl sehr viele Mängel haben würden.
    **

    Die WinForms hat der Meister höchstpersönlich(Miguel de Icaza) verrissen, in der Mailinglist von Mono

    http://lists.ximian.com/archives/public/mono-list/2002-July/000553.html

    bis dänn, O'Dog



  • Ich habe jetzt mal ein kleines Javaprogramm mit einigen ganz billigen Benchmarks geschrieben. Vielleicht kann das ja jemand in C++ und / oder C# nachprogrammieren. Was ich da gebenchmarkt habe, das findet ihr schon raus.
    [java]
    import java.util.;
    import java.io.
    ;

    public class Benchmark
    {
    public Benchmark ()
    {
    }

    public static void main (String[] args)
    {
    long [] times = new long [7];
    int i;
    int arrayLength = 5000000;
    times [0] = System.currentTimeMillis ();
    // Array erzeugen
    int [] array = new int [arrayLength];
    double [] doubleArray = new double [arrayLength];
    times [1] = System.currentTimeMillis ();
    // Zufallszahlen erzeugen
    Random rand = new Random();
    for (i = 0 ; i < arrayLength ; ++i)
    {
    array[i] = rand.nextInt ();
    doubleArray[i] = Math.abs(rand.nextDouble ());
    }
    times [2] = System.currentTimeMillis ();
    // Array sortieren
    Arrays.sort(array);
    times [3] = System.currentTimeMillis ();
    // Zahlen des Arrays in einen großen String verwandeln (jede Zeile eine Zahl)
    StringBuffer stringBuffer = new StringBuffer (arrayLength * 12);
    for (i = 0 ; i < array.length ; ++i)
    {
    stringBuffer.append(array[i]);
    stringBuffer.append('\n');
    }
    String string = stringBuffer.toString ();
    times [4] = System.currentTimeMillis ();
    // String in eine Datei abspeichern
    BufferedWriter writer;
    try
    {
    writer = new BufferedWriter (new FileWriter ("test.txt"));
    writer.write (string);
    writer.close ();
    }
    catch (IOException e)
    {
    System.out.println ("FEHLER FEHLER FEHLER FEHLER FEHLER");
    }
    times [5] = System.currentTimeMillis ();
    // Wurzeln berechnen
    for (i = 0 ; i < doubleArray.length ; ++i)
    {
    doubleArray[i] = Math.sqrt(doubleArray[i]);
    }
    times [6] = System.currentTimeMillis ();
    // Ausgabe der Zeiten
    System.out.println ("Array erzeugen : " + String.valueOf (times[1]-times[0]) + "ms");
    System.out.println ("Zufallszahlen erzeugen : " + String.valueOf (times[2]-times[1]) + "ms");
    System.out.println ("Sortieren : " + String.valueOf (times[3]-times[2]) + "ms");
    System.out.println ("String (anhängen) : " + String.valueOf (times[4]-times[3]) + "ms");
    System.out.println ("Speichern : " + String.valueOf (times[5]-times[4]) + "ms");
    System.out.println ("Wurzeln berechnen : " + String.valueOf (times[6]-times[5]) + "ms");
    }
    }[/code]
    Man muss das Programm mit "java -Xmx256m Benchmark" starten, da viel Speicher benötigt wird.

    Das ist erstmal ein Benchmark der wahrscheinlich eine sehr geringe Aussagekraft hat. Wenn jemandem etwas besseres einfällt, dann würde ich das auch in Java implementieren.

    EDIT : Ein int umfaßt in Java übrigens 32 Bit, ein double 64 Bit. (Nur, damit ihr einen Anhaltspunkt habt, welche Datentypen ihr nehmen solltet.)

    [ Dieser Beitrag wurde am 03.10.2002 um 23:54 Uhr von Gregor editiert. ]



  • Ich war mal so frei, dein Programm nach C# zu portieren. 😃
    Schon witzig, wie sich Java und C# ähneln.

    using System;

    using System.IO;

    using System.Text;

    public class Benchmark

    {

    public static void Main (string[] args)
    
    {       
    
        DateTime [] times = new DateTime [7];
    
        int i;
    
        int arrayLength = 5000000;
    
        times [0] = DateTime.Now;
    
        // Array erzeugen       
    
        int [] array = new int [arrayLength];
    
        double [] doubleArray = new double [arrayLength];
    
        times [1] = DateTime.Now;       
    
        // Zufallszahlen erzeugen
    
        Random rand = new Random();
    
        for (i = 0 ; i < arrayLength ; ++i)
    
        {
    
            array[i] = rand.Next();
    
            doubleArray[i] = Math.Abs(rand.NextDouble());
    
        }
    
        times [2] = DateTime.Now;
    
        // Array sortieren      
    
        Array.Sort(array);
    
        times [3] = DateTime.Now;       
    
        // Zahlen des Arrays in einen großen String verwandeln (jede Zeile eine Zahl)
    
        StringBuilder stringBuilder = new StringBuilder (arrayLength * 12);
    
        for (i = 0 ; i < array.Length ; ++i)
    
        {
    
            stringBuilder.Append(array[i]);
    
            stringBuilder.Append('\\n');
    
        }       
    
        times [4] = DateTime.Now;
    
        // String in eine Datei abspeichern     
    
        StreamWriter writer;
    
        try
    
        {
    
            writer = new StreamWriter ("test.txt");
    
            writer.Write(stringBuilder);
    
            writer.Close ();
    
        }
    
        catch (Exception e)
    
        {           
    
            System.Console.WriteLine( e.Message);
    
        }       
    
        times [5] = DateTime.Now;
    
        // Wurzeln berechnen
    
        for (i = 0 ; i < doubleArray.Length ; ++i)
    
        {
    
            doubleArray[i] = Math.Sqrt(doubleArray[i]);
    
        }
    
        times [6] = DateTime.Now;
    
        // Ausgabe der Zeiten
    
        System.Console.WriteLine ("Array erzeugen : " +  (times[1]-times[0]) + "ms");
    
        System.Console.WriteLine ("Zufallszahlen erzeugen : " +  (times[2]-times[1]) + "ms");
    
        System.Console.WriteLine ("Sortieren : " +  (times[3]-times[2]) + "ms");
    
        System.Console.WriteLine ("String (anhängen) : " +  (times[4]-times[3]) + "ms");
    
        System.Console.WriteLine ("Speichern : " +  (times[5]-times[4]) + "ms");
    
        System.Console.WriteLine ("Wurzeln berechnen : " +  (times[6]-times[5]) + "ms");
    
    }
    

    }[/code]

    [Edit]Hab mal das mit den Millisekunden rausgenommen.[/Edit]

    [ Dieser Beitrag wurde am 04.10.2002 um 01:19 Uhr von thomas80d editiert. ]



  • Oha! Dass die sich soooo ähnlich sind wußte ich garnicht! Hast du beide Programme mal ausgeführt? ...mir fehlt leider ein Compiler für C#, so dass ich das nicht machen kann. Du kannst ja mal die Ergebnisse posten. ...oder mir eine ausführbare Datei schicken. Das .Net-Framework habe ich letzt bei mir installiert, das sollte also auch bei mir gehen.

    [ Dieser Beitrag wurde am 04.10.2002 um 01:07 Uhr von Gregor editiert. ]



  • Ich hab dir mal die exe geschickt, da ich keine Java bei mir drauf hab.



  • OK! Hier kommen die Ergebnisse : (getestet wurde auf einem P4M mit 1,2/1,6GHz, 384MB RAM)

    1,2 GHz :

    C#            Java
    Array erzeugen         :   200             200
    Zufallszahlen erzeugen :  1202            4527
    Sortieren              :  4667            2784
    String anhängen        :  6790            4366
    Speichern              :  5728            3114
    Wurzeln berechnen      :   170             211
    

    1,6 GHz :

    C#            Java
    Array erzeugen         :   140             170
    Zufallszahlen erzeugen :   861            3405
    Sortieren              :  3375            2073
    String anhängen        :  4987            3305
    Speichern              :  1843            2253
    Wurzeln berechnen      :   130             130
    

    Alle Angaben sind Millisekunden. ...allerdings sah der Output bei C# etwas komisch aus! 🙂

    [ Dieser Beitrag wurde am 04.10.2002 um 01:25 Uhr von Gregor editiert. ]



  • Bei der Ausgabe hatte ich das Milliseconds rausgenommen, da bei meinem Prozessor einigen Sachen schon Sekunden gedauert haben. 😉

    Die Ausgabe ist ganz normal Stunden:Minuten:Sekunden.Millisekunden.



  • Original erstellt von thomas80d:
    **
    Die Ausgabe ist ganz normal Stunden:Minuten:Sekunden.Millisekunden.**

    Ja! Schon! ...nur steht dahinter dann nochmal "ms". 😃 😃 ...aber das ist egal.

    OK! Was lernen wir aus dem Benchmark :

    Mit C# kann man schneller Zufallszahlen erzeugen.
    Mit Java kann man schneller sortieren.
    Mit Java kann man schneller Strings aneinanderhängen.
    Beim Speichern hängt der Unterschied von der Geschwindigkeit des Prozessors ab.



  • Die von C# erzeugte Textdatei ist übrigens etwas kleiner. Die Java-Datei hat etwa 54,9MB, die C#-Datei hat etwa 52,4MB. Ich weiß nicht, woran das liegt. Es ist aber reproduzierbar, somit liegt es nicht an einer zufälligen Abweichung, die auchmal beim anderen Programm passieren könnte.

    EDIT : ...mit "MB" sind oben nicht "MegaByte", sondern "Millionen Byte" gemeint. ...ich hatte keine Lust, das umzurechnen! 🙂 🙂

    EDIT 2 : Der Unterschied ist, dass der Zufallsgenerator bei C# nur positive Zahlen erzeugt, während bei Java auch negative erzeugt werden. Bei Java gibt es also etwa 2500000 mal noch ein "-".

    [ Dieser Beitrag wurde am 04.10.2002 um 03:15 Uhr von Gregor editiert. ]



  • Original erstellt von CengizS:
    **Für solche, die keine Programme kennen, die in Java geschrieben wurden.

    • Webgain StructureBuilder
    • Headway reView
    • Together Control Center
    • NetBeans (SunONE formerly Forté for Java)
    • TOPlink (mittlerweile von Oracle)
    • Borland JBuilder
    • Merant PVCS
    • und weitere viele kleine GUI-Clients für Kazaa, Esel, CVS etc. pp

    Nachtrag: Dass der Netscape Communicator in Java entwickelt wurde wäre mir neu.

    [ Dieser Beitrag wurde am 25.09.2002 um 16:40 Uhr von [qb]CengizS** editiert. ][/QB]

    Borland JBuilder!



  • @ Lars : Öhm... Ich glaube, du hast den Beitrag von CengizS nicht so ganz gelesen! 🙂 Kann das sein?

    Wenn hier noch einer C++-Code zu dem Programm oben schreibt, hier postet und mir eine ausführbare Datei schickt, dann würde ich die Ergebnisse oben entsprechend erweitern.



  • wir sollten das Java Programm auch mal mit dem gcj compilieren und testen (natürlich nicht als Konkurent zum Java Programm, sondern nur aus interesse, da es ja unfair ist ein kompiliertes gegen ein zujitterndes Programm laufen zu lassen)

    Also wir brauchen folgende Tests:

    C#:
    Mono
    dotGNU
    Rotor (und Rotor Port für Linux)

    Java:
    JDK 1.4
    gcj

    C++:
    g++ 3
    i++ (wenn möglich)

    ich portier dann mal das Programm zu C++, kann aber bis morgen dauern, da ich heute viel zu tun habe 😞



  • BTW.
    wir sollten auch die gesammt Laufzeit der Programme messen, da wir sonst nicht die Zeit beachten, die die Programme zum Jitten brauchen.

    Ich habe mal angefangen mit der C++ Version (schreibe einmal eine, die mehr C mäßig ist und eine die so stark wie möglich die libstdc++ benutzt)



  • Original erstellt von kingruedi:
    **
    wir sollten auch die gesammt Laufzeit der Programme messen, da wir sonst nicht die Zeit beachten, die die Programme zum Jitten brauchen.
    **

    Wie kann man das eigentlich unter WinXP machen?



  • ka.

    Vielleicht Zeitmessen, Programmaufrufen, Zeitmessen oder so 🙂

    darf man jetzt eigentlich Performance Tests von der MS dotNET Implementierung machen? Ich hab gehört, dass dürfte man nicht laut Lizenz Bedingung.



  • Original erstellt von kingruedi:
    **
    darf man jetzt eigentlich Performance Tests von der MS dotNET Implementierung machen? Ich hab gehört, dass dürfte man nicht laut Lizenz Bedingung.**

    Keine Ahnung. Ich habe mir die Lizenzbedingungen nicht durchgelesen. Aber ich denke mal, soetwas entbehrt jeder Rechtsgrundlage. ...soweit kommt das noch, dass man etwas nicht mit etwas anderem vergleichen darf, damit man eine Entscheidungshilfe hat, was man einsetzen sollte. Ich glaube, so eine Bedingung würde vom Gesetz her glatt unter den Begriff "Sittenwidrig" fallen! 🙂


Anmelden zum Antworten