Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Java » Geschwindigkeit

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
24.09.2002, 13:13 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

Hab da mal ne kleine Frage an alle Java-Kenner: Was sind Eure Erfahrungen mit Java hinsichtlich der Geschwindigkeit? Sowohl P-Code als auch JIT-Ausführung...
Ich hab mal nen kleinen Test laufen lassen, ein einfacher Algorithmus zur Langzahlarithmetik, programmiert in C#, C++, Delphi und Java. Während die ersten drei sich zwischen 20 und 25 Sekunden bewegt haben (C# war sogar schneller als Delphi! *staun*), hab ich den Java-Test nach zwei Minuten abgebrochen.....

Wie kann die Geschwindigkeit der JVM gesteigert werden? Wie wärs mit einer "roten Liste" von Konstrukten und Klassen, auf die man lieber verzichten sollte?
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.09.2002, 14:58 Uhr
~0xdeadbeef
Gast


Moin Prost!

Java gilt zwar als sehr langsam, das ist allerdings nur bedingt wahr.

Zum einen liegt die Stärke des Java-Bytecodes nicht in seiner Geschwindigkeit, sondern in der Plattformunabhängigkeit. Das heisst, zum einen geht Zeit verloren, weil er interpretiert werden muss, zum anderen dadurch, dass der Bytecode bestimmteOptimierungen, die in anderen Sprachen gang und gebe sind, garnicht verwenden kann weil es sein kann, dass die Maschine, auf der er ausgeführt werden soll, damit nicht zurecht kommt. Das kann allerdings durch die JIT-Kompilierung wieder ausgeglichen werden. Die JIT-Kompilierung ist auch der Grund, warum C# in deinem Test so gut abgeschnitten hat; C# wird standardmässig JIT-kompiliert. Ist ja auch nicht blöd.
Zum anderen ist eine der wesentlichen Stärken von Java, dass sie so konsequent objektorientiert ist. Damit erzieht Java den Programmierer sozusagen dazu, ein übersichtliches Programm zu schreiben. Das senkt Entwicklungskosten, und steigert gerade bei grossen, komplizierten Projekten die Effizienz, so dass sich der scheinbare Geschwindigkeitsnachteil schnell wieder ausgleicht. Von daher halte ich es auch für keine gute Idee, eine 'rote Liste', wie du sie vorschlägst aufzustellen. Damit würdest du Java seine Stärke nehmen.

Die krasse Diskrepanz deiner Ergebnisse wundert mich aber trotzdem - ist das Java-Programm zu lang, um es hier zu posten? Ich würd gern mal reinschauen.

Grüße,

0xdeadbeef
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.09.2002, 17:17 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

Naja, die theoretischen Vorteile von Java kenn ich, was mich halt stört, ist die besch...eidene Geschwindigkeit. C# wird auch JIT übersetzt, und ist dabei sogar schneller als eine reine Compilersprache... wieso ist dann Java grundsätzlich so lahm...

Den Quelltext von meinem Test hab ich nur noch in C# und Delphi, die Java-Variante hab ich gelöscht... müßte aber kein Problem sein, C# nach Java umzubauen, hab ich damals ja auch gemacht.
Wenn Du mal reinschnuppern willst, unter www.leif-bruder.de/download/Langzahlarithmetik.zip gibt's den Quelltext incl. Algorithmusbeschreibung usw. War meine Arbeit fürs Proseminar 02...
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.

Dieser Post wurde am 24.09.2002 um 17:19 Uhr von Leif editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.09.2002, 17:47 Uhr
~0xdeadbeef
Gast


Du musst java schon jit-kompilieren, um einen vernünftigen Vergleich zu haben - java -jar meinejar.jar reicht da nicht. Ich schau mir deinen Quellcode mal an.

Ciao,

0xdeadbeef
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.09.2002, 17:58 Uhr
~0xdeadbeef
Gast


OK, ich hab mir jetzt nicht die Mühe gemacht, das ganze zu übersetzen, sondern hab Klassen aus den JFC genommen, aber bei mir braucht das Ding zur Multiplikation von zwei 20-stelligen Zahlen deutlich weniger als ne halbe Sekunde.


C++:
import java.math.*;
class Test
{
    public static void main(String[] args) {
        BigInteger bi1 = new BigInteger("16622171873838713987");
        BigInteger bi2 = new BigInteger("99281746171746461711");
        System.out.println(bi1.multiply(bi2));
    }
}


Ich weiss ja nicht, was du für nen Rechner hast, aber ich denke ernsthaft, dass bei dir irgendwo ein Tipfeeler drin war, der in eine Endlosschleife geführt hat.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.09.2002, 19:34 Uhr
Bruder Leif
dances with systems
(Operator)


Vorsicht - ich rede hier von einer Million Multiplikationen, nicht einer! *g*

Ich glaub aber kaum, daß da ne Endlosschleife war, die anderen Testprogramme haben einwandfrei funktioniert - nur eben ziemlich langsam. Hängt vielleicht mit dem Bytecode zusammen, ich hab irgendwo nen Vergleich zwischen der Java- und der .NET-VM gesehen, das werd ich mir mal ansehen...
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.09.2002, 09:44 Uhr
~0xdeadbeef
Gast


Also, das

C++:
import java.math.*;
import java.util.*;

class Bench
{
    public static void main(String[] args) {
        BigInteger bi1 = new BigInteger("31415926535897932384");
        BigInteger bi2 = new BigInteger("27182818284590452354");
        BigInteger bimult;
        GregorianCalendar start = new GregorianCalendar(); //setzt automatisch auf Systemzeit

        for(int i = 0; i < 1000000; i++) {
            bimult = bi1.multiply(bi2);
        }
        GregorianCalendar stop = new GregorianCalendar();
        System.out.println("Fertig in "
                           + (stop.get(Calendar.MINUTE) - start.get(Calendar.MINUTE)) + " Minuten, "
                           + (stop.get(Calendar.SECOND) - start.get(Calendar.SECOND)) + " Sekunden und "
                           + (stop.get(Calendar.MILLISECOND) - start.get(Calendar.MILLISECOND)) + " Millisekunden");
    }
}


Gibt bei mir aus:
Fertig in 0 Minuten, 2 Sekunden und 374 Millisekunden
Ich hab jetzt dummerweise keinen Vergleichswert, weil ich weder einen Delphi- noch einen C#-Compiler habe, und dein C++-Beispiel bei mir nicht kompiliert. Lass das bei dir mal durchlaufen. Ich übersetze inzwischen deine Langzahlklasse nach Java.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.09.2002, 10:17 Uhr
NemoEimi



>Gibt bei mir aus:
>Fertig in 0 Minuten, 2 Sekunden und 374 Millisekunden

Leif führt seine Rechnungen im Zehnersystem durch, java.math.BigInteger rechnet mit einer Zahldarstellung zur Basis 2^32. Das allein sollte Java *erheblich* schneller machen als Leifs Programm, und es ist insofern keine Vergleichbarkeit der verwendeten Algorithmen gegeben.

Grüße,
NemoEimi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
25.09.2002, 10:39 Uhr
NemoEimi



[
>Hab da mal ne kleine Frage an alle Java-Kenner: Was sind Eure Erfahrungen >mit Java hinsichtlich der Geschwindigkeit? Sowohl P-Code als auch >JIT-Ausführung...

Linpack ist in Java auf meinem Rechner knapp 2.5-mal langsamer als die Fortran-Version. Bei ein paar kleineren Numerik-Tests (Differentialgleichungslöser, Berechnen einer Ausgleichsgeraden, Monte-Carlo-Simulation) hatte ich bessere Werte im Vergleich Java vs. C.

Grüße,
NemoEimi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
25.09.2002, 10:51 Uhr
~0xdeadbeef
Gast



Zitat:
Leif führt seine Rechnungen im Zehnersystem durch, java.math.BigInteger rechnet mit einer Zahldarstellung zur Basis 2^32. Das allein sollte Java *erheblich* schneller machen als Leifs Programm, und es ist insofern keine Vergleichbarkeit der verwendeten Algorithmen gegeben.

Jepp, das ist mir inzwischen auch aufgefallen (use the force, read the source ;-) ). Wie dem auch sei, ich hab das Programm mal nach Java übersetzt (s.u.); bei mir läuft es in 57 Sek. durch.
@ Leif: Lass dasProgramm mal bei dir laufen; ich kann deine anderen Codes nicht kompilieren, hab also keine Vergleichswerte. Hier der Code:

C++:
//Bench.java
import java.util.*;
import java.sql.*;

class Bench {
   public static void main(String[] args) {
       try {
           GregorianCalendar start, stop;
           System.out.println("Zwei zwanzigstellige Zahlen werden 1'000'000mal multipliziert...");

           String sZahl1 = "31415926535897932384"; //$\pi \cdot 10^{19}$
           String sZahl2 = "27182818284590452354"; //$ e  \cdot 10^{19}$

           CLangzahl a = new CLangzahl(10, 40);
           CLangzahl b = new CLangzahl(10, 40);

           for(int i=0; i<20; i++) a.SetStelle(i, (int) (sZahl1.charAt(i) - '0'));
           for(int i=0; i<20; i++) b.SetStelle(i, (int) (sZahl2.charAt(i) - '0'));

           start = new GregorianCalendar();

           for(int iCounter=0; iCounter<1000000; iCounter++) a.Mult(b);

           stop = new GregorianCalendar();
           System.out.println("Fertig, Dauer: " + new Time(stop.getTimeInMillis() - start.getTimeInMillis() - 60 * 60 * 1000 /*GMT ausgleichen*/));
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

//CLangzahl.java
class CLangzahl {
    private int iStellen;     // Anzahl der Stellen der Zahl
    private int iBasis;       // Basis des verwendeten Zahlsystems
    private int[] aiZiffern;  // Die Zahl im Speicher

    private static String sZeichen = "0123456789ABCDEF";

    public CLangzahl(int Basis, int Stellen) throws Exception {
        if(Basis<2 || Basis > 16)
            throw new Exception("CLangzahl.CLangzahl: Basis < 2 || Basis > 16");

        iStellen = Stellen;
        iBasis = Basis;
        aiZiffern = new int[Stellen];
        SetNull();
    }

    public void SetNull() {
        for(int i=0; i<iStellen; i++) aiZiffern[i] = 0;
    }

    public void SetStelle(int Stelle, int Value) throws Exception {
        if(Stelle>=iStellen) throw new Exception("CLangzahl.SetStelle: Indexfehler");
        if(Value>=iBasis) throw new Exception("CLangzahl.SetStelle: Basisfehler");

        aiZiffern[iStellen-1-Stelle] = Value;
    }

    private void ArrayAdd(int[] aiZiel, int[] aiS1,
                          int[] aiS2, int iS2Start) {

        int iTeilsumme, iUebertrag=0;
        int iAnzahlZiffern = Math.min(aiS1.length, Math.min(aiS2.length,
                                                            aiZiel.length));

        for(int i=0; i<iS2Start; i++)
            aiZiel[aiZiel.length-1-i] = aiS1[aiS1.length-1-i];

        for(int i=iS2Start; i<iAnzahlZiffern; i++) {
            iTeilsumme = aiS1[aiS1.length-1-i] + iUebertrag +
                aiS2[aiS2.length-1-i+iS2Start];
            iUebertrag = (iTeilsumme >= iBasis) ? 1 : 0;
            aiZiel[aiZiel.length-1-i] = (iUebertrag == 0) ? iTeilsumme :
                (iTeilsumme - iBasis);
        }
    }

    public void Mult(CLangzahl aZahl) throws Exception {
        if(aZahl.iBasis != iBasis) throw new Exception("CLangzahl.Mult: Unterschiedliche Zahlsysteme");
        if(aZahl.iStellen != iStellen) throw new Exception("CLangzahl.Mult: Unterschiedliche Stellenzahl");

        int[][] aiMultiplikation = new int[iBasis][];

        aiMultiplikation[0] = new int[iStellen+1];
        for(int i=1; i<iBasis; i++) {
            aiMultiplikation[i] = new int[iStellen+1];
            ArrayAdd(aiMultiplikation[i], aiMultiplikation[i-1],
                     aiZiffern, 0);
        }

        SetNull();
        for(int i=0; i<iStellen; i++)
            if(aZahl.aiZiffern[i] != 0)
                ArrayAdd(aiZiffern, aiZiffern,
                         aiMultiplikation[aZahl.aiZiffern[i]],
                         iStellen-i-1);
    }
}


GNUß,

0xdeadbeef
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ Java ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: