Double schneller als Float?

vimar

Bekanntes Mitglied
Java:
public class Speedtest {

    /**
     * @param args the command line arguments
     */
    static double vorher;
    static double nachher;
    
    static double d1,d2,d3,d4;
   static float f1,f2,f3,f4;
    static double dErg;
    static float fErg;
    
    public static void main(String[] args) {
        // TODO code application logic here
        
        f1 = (float) Math.sqrt(3);
        f2 = (float) Math.sqrt(5);
        f3 = (float) Math.sqrt(7);
        f4 = (float) Math.sqrt(10);
        
        
        d1 = Math.sqrt(3);
        d2 = Math.sqrt(5);
        d3 = Math.sqrt(7);
        d4 = Math.sqrt(10);
        
       // float rechnung       
        vorher = System.currentTimeMillis();
        fErg = (f2-f1)*(f2-f1) + (f4-f3)* (f4-f3);
         nachher = System.currentTimeMillis()- vorher;
         
         System.out.println("Float Time: " + fErg);
        
        
     // double rechnung  
        vorher = System.currentTimeMillis();
        dErg = (d2-d1)*(d2-d1) + (d4-d3)* (d4-d3);
        nachher = System.currentTimeMillis()- vorher;
        
        System.out.println("Double Time: "+ nachher);
        
        
    }
}

Output:

run:
Float Time: 0.520833
Double Time: 0.0
BUILD SUCCESSFUL (total time: 0 seconds)


float ist 32bit, double 64bit und float ist langsamer? wieso?
 

Marco13

Top Contributor
In einer Millsekunde kann ein normaler PC theoretisch vielleicht so um die 1000000 floating-Point-Operationen machen. System.currentTimeMillis hat eine Auflösung von ca. 15ms (auf Windows).
(Mehr muss man eigentlich nicht sagen ;))

Um das zu vergleichen muss man sich etwas mehr Mühe geben....
 
Z

Zeitgeber

Gast
In einer Millsekunde kann ein normaler PC theoretisch vielleicht so um die 1000000 floating-Point-Operationen machen. System.currentTimeMillis hat eine Auflösung von ca. 15ms (auf Windows).
(Mehr muss man eigentlich nicht sagen ;))

Um das zu vergleichen muss man sich etwas mehr Mühe geben....

1000000 FLOPS = 1 MFLOPS

Geschwindigkeit modernere Systeme nach Wikipedia

Intel Pentium 4 3,2GHz : 3-6 GFLOPS
Intel Core i7 3,2GHz 4-Core HT : 30-50 GFLOPS
Intel Core i7 3,4GHz 4-Core Sandy-Bridge : bis zu 100 GFLOPS

Deine 1 MFLOPS sind also ein wenig untertrieben ;-).

Zu System.currentTimeMillis

Java:
public class MSTest
{
	public static void main(String[] args)
	{
		for(int i=0; i<20; i++)
		{
			System.out.println(System.currentTimeMillis());
		}
	}
}

Ausgabe

Code:
1336969131631
1336969131633
1336969131633
1336969131633
1336969131633
1336969131633
1336969131633
1336969131635
1336969131635
1336969131635
1336969131635
1336969131635
1336969131635
1336969131635
1336969131635
1336969131637
1336969131637
1336969131637
1336969131639
1336969131641

erzeugt mit:
Pentium 4 3,0GHz HT
4GB DDR2-DualChannel RAM
Windows 7 Ultimate 64-Bit
Java7 Update4 64-Bit

15ms sind also etwas zu viel, 2-5ms trifft es schon eher, wobei ich bei Micro-Benchmarks wenn überhaupt System.nanoTime nutzen würde.
 

HimBromBeere

Top Contributor
Für solche Tests sollte man trotzdem nicht nur einen einzigen Durchlauf machen, da einfach zu viele andere Parameter mit hineinspielen. Erst häufige Widerholung (z.B. 1000 Durchläufe) bringt vergleichbare Ergebnisse.
 

Marco13

Top Contributor
@Zeitgeber: Ich hatte auch die Zahlen nochmal nachgesehen - aber es sollte nur eine Größenordnung sein (bei den von dir angegebenen Zahlen schwankt es ja zwischen 3 und 100 MFLO ... nicht PS, sondern PmS ) - wie soll man solche theoretischen Zahlen auf eine teilweise interpretierte Sprache und mehrere Kerne und Multi-Threading-Betriebssysteme umrechnen....?

@HimBromBeere: Tatsächlich müßte man mindestens 2500, ggf. sogar >10000 Durchläufe machen, und vor allem die Rechnung in eine Methode packen, damit der JIT das ganze in nativen Code umwandelt...
 
Z

Zeitgeber

Gast
@Zeitgeber: Ich hatte auch die Zahlen nochmal nachgesehen - aber es sollte nur eine Größenordnung sein (bei den von dir angegebenen Zahlen schwankt es ja zwischen 3 und 100 MFLO ... nicht PS, sondern PmS ) - wie soll man solche theoretischen Zahlen auf eine teilweise interpretierte Sprache und mehrere Kerne und Multi-Threading-Betriebssysteme umrechnen....?

Entschuldige, aber wie kommst du bei meinen Zahlen auf etwas zwischen 3 bis 100 MFLOPS ?
Und : es heißt schon FLOPS, laut Wikipedia : Floating Point Operations Per Second
FLOPmS würde ja dann für Per milli Second stehen, und einen Rechner der 100 MFLOp's pro MilliSekunde macht kann ich mir dann doch nur schwer vorstellen. Oder habe ich das "m" falsch interpretiert ?

Ich habe mich aber bezüglich der Leistungsfähigkeit durch Google geklickt : es gibt sogar "extreme" Systeme die die 1 Tera-FLOPS schaffen.

In wie weit man diese theoretischen Zahlen speziell auf Java und dessen VM anwenden kann ist natürlich in Punkt wo gerade solche Micro-Benchmarks überhaupt keine Aussagefähigkeit haben. Zu mal ja auch bereits JIT angesprochen wurde was ja erst bei einer gewissen Häufigkeit greift.
 

Marco13

Top Contributor
Vielleicht sind 4 Stunden Schlaf DOCH zu wenig (*Augen für ein paar Sekunden zu macht und das als 'Zwinkern' bezeichnet* ) aber
1 GFLOPS = 1.000.000.000 FP Operation pro Sekunde
1 MFLOPS = 1.000.000 FP Operation pro Sekunde
1 MFLOPmS = 1.000.000 FP Operation pro milli-Sekunde
= 1.000.000.000 FP Operation pro Sekunde
= 1 GFLOPS
???:L :bahnhof:

Die Zahlen sind ja nur theoretisch. Ein Prozessor mit 3 GHz macht 3.000.000.000 Takte pro Sekunde. Die Anzahl der pro Operation benötigten Takte kann man kaum sinnvoll quantifizieren, weil sie vom Instruktionsmix und Verwendung von SIMD und mehreren Cores abhängt, aber ... sei mal vereinfachend und frei aus der Luft gegriffen angenommen, dass ein FMUL 3 Takte benötigt, dann hat er rechnerisch 1.000.000.000 FLOPS = 1 GFLOPS. Mit SIMD werden dann vielleicht 4 floats auf einmal verarbeitet, und das ganze auf 4 Cores, dann ist man bei 16 GFLOPS. Die 100 GFLOPS vom letzten erschienen mir auch unerklärlich hoch, aber ... die haben sich wohl Mühe gegeben ;)

Die TFLOPS und PFLOPS-Systeme aus den Top500 haben diese Rechenleistungen ja auch nur theoretisch. Da wird wohl auch ziemlich pragmatisch "(Takt*Cores*SIMD)/CyclesPerOp" gerechnet, und dann freut man sich, wenn man "künstlichen" Benchmarks a la LINPACK >80% dieser theoretischen Leistung erreicht.

Wie auch immer: Der gepostete Test sagt nichts aus, mehr wollte ich eigentlich nicht sagen ;)
 

fastjack

Top Contributor
Whl. ist es einen Tick langsamer, da der double auf float convertiert wird . float f = (float) Math.sqrt(3); Bei double eben nicht.

Code:
+---------------------------+----------+------------+----------+----------+-----------------+-----------------+
| Bench                     |   Rounds |    Objects |       ms | ms (avg) |              nt |        nt (avg) |
+---------------------------+----------+------------+----------+----------+-----------------+-----------------+
| Double                    |   10.000 |          1 |        2 |        0 |         859.363 |              85 |
| Double                    |  100.000 |          1 |        8 |        0 |       4.472.798 |              44 |
| Double                    | 1.000.000 |          1 |       67 |        0 |      26.777.320 |              26 |
| Double                    | 10.000.000 |          1 |      700 |        0 |     269.944.065 |              26 |
| Double                    | 100.000.000 |          1 |    6.973 |        0 |             ... |             ... |
| Float                     |   10.000 |          1 |        2 |        0 |         829.209 |              82 |
| Float                     |  100.000 |          1 |       16 |        0 |       4.715.182 |              47 |
| Float                     | 1.000.000 |          1 |       69 |        0 |      23.755.140 |              23 |
| Float                     | 10.000.000 |          1 |      680 |        0 |     233.446.834 |              23 |
| Float                     | 100.000.000 |          1 |    6.905 |        0 |             ... |             ... |
+---------------------------+----------+------------+----------+----------+-----------------+-----------------+
java version 1.6.0_30
Java(TM) SE Runtime Environment(build 1.6.0_30-b12)
Java HotSpot(TM) 64-Bit Server VM(build 20.5-b03, mixed mode)
Linux(3.3.0-4.fc16.x86_64) amd64
Max memory: 3562MB

16Gig RAM, 8 Core, i7-2600k CPU, 3.4Ghz
Fedora 16

Java:
    static Bench doubleBench = new AbstractBench() {
        double d1 = Math.sqrt(3);
        double d2 = Math.sqrt(5);
        double d3 = Math.sqrt(7);
        double d4 = Math.sqrt(10);
        double dErg;

        @Override
        public String getName() {
            return "Double";
        }

        @Override
        public void execute(long lm) {
            dErg = (d2-d1)*(d2-d1) + (d4-d3)* (d4-d3);
        }
    };

    static Bench floatBench = new AbstractBench() {
        float d1 = (float) Math.sqrt(3);
        float d2 = (float) Math.sqrt(5);
        float d3 = (float) Math.sqrt(7);
        float d4 = (float) Math.sqrt(10);
        float dErg;

        @Override
        public String getName() {
            return "Float";
        }

        @Override
        public void execute(long lm) {
            dErg = (d2-d1)*(d2-d1) + (d4-d3)* (d4-d3);
        }
    };

    public static void main(String[] args) {
        QuickBench.benchNxM(1000, 50000, new long[] { 10000, 100000, 1000000, 10000000, 100000000 }, new long[] { 1 }, new Bench[] { doubleBench, floatBench });
    }

P.S.: 50.000 Durchläufe als warm-up für Hotspot. Zuerst wird double getestet, dann float, dann nochmal alles inverse.
 
Zuletzt bearbeitet:
Z

Zeitgeber

Gast
Vielleicht sind 4 Stunden Schlaf DOCH zu wenig (*Augen für ein paar Sekunden zu macht und das als 'Zwinkern' bezeichnet* ) aber
1 GFLOPS = 1.000.000.000 FP Operation pro Sekunde
1 MFLOPS = 1.000.000 FP Operation pro Sekunde
1 MFLOPmS = 1.000.000 FP Operation pro milli-Sekunde
= 1.000.000.000 FP Operation pro Sekunde
= 1 GFLOPS
???:L :bahnhof:

Die Zahlen sind ja nur theoretisch. Ein Prozessor mit 3 GHz macht 3.000.000.000 Takte pro Sekunde. Die Anzahl der pro Operation benötigten Takte kann man kaum sinnvoll quantifizieren, weil sie vom Instruktionsmix und Verwendung von SIMD und mehreren Cores abhängt, aber ... sei mal vereinfachend und frei aus der Luft gegriffen angenommen, dass ein FMUL 3 Takte benötigt, dann hat er rechnerisch 1.000.000.000 FLOPS = 1 GFLOPS. Mit SIMD werden dann vielleicht 4 floats auf einmal verarbeitet, und das ganze auf 4 Cores, dann ist man bei 16 GFLOPS. Die 100 GFLOPS vom letzten erschienen mir auch unerklärlich hoch, aber ... die haben sich wohl Mühe gegeben ;)

Die TFLOPS und PFLOPS-Systeme aus den Top500 haben diese Rechenleistungen ja auch nur theoretisch. Da wird wohl auch ziemlich pragmatisch "(Takt*Cores*SIMD)/CyclesPerOp" gerechnet, und dann freut man sich, wenn man "künstlichen" Benchmarks a la LINPACK >80% dieser theoretischen Leistung erreicht.

Wie auch immer: Der gepostete Test sagt nichts aus, mehr wollte ich eigentlich nicht sagen ;)

Ich glaube da hast du recht : zu viele Zahlen und zu wenig Schlaf vertragen sich nicht. Irgendwie verwirren mich diese ganzen 0en dann doch zu sehr.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C was is schneller Vector oder double Array Java Basics - Anfänger-Themen 5
W Double or Float zusammenrechnen Java Basics - Anfänger-Themen 15
I Review von euch erwünscht, double Rechnung falsch Java Basics - Anfänger-Themen 34
X wie bekomme ich durch Eingabeaufforderung definierte double in einen Befehl, welcher 3 erwartete double braucht? Java Basics - Anfänger-Themen 3
Avalon String in Double bzw. Währung konvertieren Java Basics - Anfänger-Themen 6
MoxMorris Integer.MAX_VALUE und Double.MAX_VALUE Unterschied Java Basics - Anfänger-Themen 3
krgewb Double mit zwei Nachkommastellen Java Basics - Anfänger-Themen 2
B Produkt eines double - streams Java Basics - Anfänger-Themen 3
Lion.King Fehler in double und int Java Basics - Anfänger-Themen 7
F java: incompatible types: possible lossy conversion from double to int Java Basics - Anfänger-Themen 1
J Double Variable und Addition Java Basics - Anfänger-Themen 2
F Double Ausgabe nicht wissenschaftlich Java Basics - Anfänger-Themen 16
S Fragen zu Ausgabe double und float Java Basics - Anfänger-Themen 3
Kotelettklopfer Variablen Double zwingen Ganzzahlen mit 2 Nachkommastellen auszugeben Java Basics - Anfänger-Themen 10
A possible lossy conversion from double to int Java Basics - Anfänger-Themen 5
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
L ArrayList<String> --> double[] array Java Basics - Anfänger-Themen 18
FelixN Array mit verschiedene Datentypen als Rückgabewert? (Long und Double) Java Basics - Anfänger-Themen 3
J Transformation zweier Integer in ein Double Java Basics - Anfänger-Themen 26
N The method setSaldo(double) in the type Konto is not applicable for the arguments (int, int) Java Basics - Anfänger-Themen 2
C Konvertierung des int typs in den double typ für die Ausgabe mit Nachkommastellen Java Basics - Anfänger-Themen 4
V Erste Schritte Die Nuller bei double NICHT abschneiden Java Basics - Anfänger-Themen 4
Y Datentypen Double Division ungenau Java Basics - Anfänger-Themen 45
L Datentypen Rechnen und abrunden mit double Java Basics - Anfänger-Themen 7
M Writer für unterschiedliche Obj/inbt/double erstellen? Java Basics - Anfänger-Themen 1
F Character umwandeln als Double Werte Java Basics - Anfänger-Themen 8
M Double Wert nach n abschneiden ohne zu runden Java Basics - Anfänger-Themen 1
D Methode mit Übergabe double und Rückgabe String Java Basics - Anfänger-Themen 2
P Hilfe bei Double Java Basics - Anfänger-Themen 1
B Rückgabe von zwei Werten: String und double Java Basics - Anfänger-Themen 14
B HQL / Hibernate, GroupBy und Ausgabe als Double Java Basics - Anfänger-Themen 1
M Konvertierung String -> double Java Basics - Anfänger-Themen 8
A Double Scan eingrenzen Java Basics - Anfänger-Themen 2
O Erste Schritte Potenzmethode per double Java Basics - Anfänger-Themen 11
A Random Double mit Math.round() runden? Java Basics - Anfänger-Themen 1
H Double oder nicht? Java Basics - Anfänger-Themen 7
J int array als double array ausgeben Java Basics - Anfänger-Themen 9
M Int und Double in Array speichern Java Basics - Anfänger-Themen 1
J String, Int und double Array sortieren Java Basics - Anfänger-Themen 16
B Hashing (verkettet/double) Java Basics - Anfänger-Themen 0
L Konvertieren von String zu double?! Java Basics - Anfänger-Themen 6
V Operatoren Warum kommt bei double bei den Nachkommastellen irgendwann eine 2?! (1.20000000000002) Java Basics - Anfänger-Themen 5
geekex Double zu String umwandeln in einer Methode Java Basics - Anfänger-Themen 28
E Bruch erstellen - Von Int zu Double Ergebnis Java Basics - Anfänger-Themen 24
G Probleme beim casten von double zu int Java Basics - Anfänger-Themen 3
I Double.ParseDouble 2 Textfelder Java Basics - Anfänger-Themen 1
M JComboBox feste double Werte zu ordnen Java Basics - Anfänger-Themen 8
P Datentypen Kann ich bei double Komma statt Punkt eingeben? Java Basics - Anfänger-Themen 14
E Von Double zu Long umwandeln Java Basics - Anfänger-Themen 9
L Bei falscher Eingabe soll NaN zurückgegeben werden, Rückgabetyp jedoch double Java Basics - Anfänger-Themen 3
V Variablen Double später deklarieren Java Basics - Anfänger-Themen 7
V double = 1.34823e-300 Java Basics - Anfänger-Themen 5
W double*double error Java Basics - Anfänger-Themen 4
kilopack15 Mehr Nachkommastellen mit double Java Basics - Anfänger-Themen 14
T Input/Output Double und String als Eingabe einlesen Java Basics - Anfänger-Themen 9
J [Rundungsfehler bei Double] Grundkurs Java: Checke Lösungsweg nicht Java Basics - Anfänger-Themen 1
W In einer Function<Double, Double> undefinierte Rechenoperationen abfangen? Java Basics - Anfänger-Themen 3
T set Metode für Double Java Basics - Anfänger-Themen 6
Hijo2006 String to Double Java Basics - Anfänger-Themen 4
K Double Wert runden und in Int umwandeln Java Basics - Anfänger-Themen 7
A Kommafehler beim double einleseen korrigieren Java Basics - Anfänger-Themen 2
K Operatoren The Operator * is undefined for the argument type(s) double, String Java Basics - Anfänger-Themen 4
das_leon String zu double konventieren Java Basics - Anfänger-Themen 1
K Genauer als Double? Java Basics - Anfänger-Themen 4
T Double.parseDouble(args[0]) Java Basics - Anfänger-Themen 13
A Java Ungenauigkeit double Java Basics - Anfänger-Themen 6
B Methoden The method mirror(double[]) in the type Convolution is not applicable for the arguments (double) Java Basics - Anfänger-Themen 8
C Typumwandlung von int<-->double Java Basics - Anfänger-Themen 6
M Double Wert auf 2 Kommastellen runden Java Basics - Anfänger-Themen 2
S Regelabfragen aus Double-Array Java Basics - Anfänger-Themen 2
A Erste Schritte Double Wert aus String zu int Java Basics - Anfänger-Themen 2
P Rückgabe erflogt nicht als Double Java Basics - Anfänger-Themen 2
K Erste Schritte switch - Warum sind long/float/double/... nicht erlaubt? Java Basics - Anfänger-Themen 5
P scanner ein Double einlesen Java Basics - Anfänger-Themen 10
T Java double berechnung fehler Java Basics - Anfänger-Themen 2
S double[x] , double[y] zu Point[] points kopieren? Java Basics - Anfänger-Themen 15
G double in float umwandeln Java Basics - Anfänger-Themen 2
F double[] an andere Methode übergeben Java Basics - Anfänger-Themen 1
B Datentypen Test float und double speichern Zahlen nur ungefähr Java Basics - Anfänger-Themen 4
S Datentypen double - kommastellen abschneiden Java Basics - Anfänger-Themen 6
M int double int double Graph Java Basics - Anfänger-Themen 3
K ArrayList<Double> --> double[] array Java Basics - Anfänger-Themen 5
Z Double in komma und Punkt akzeptieren -> Robusteeingabe Java Basics - Anfänger-Themen 7
S Double und Gleitkommazahlen mit JUnit testen Java Basics - Anfänger-Themen 7
B Datentypen Multiplzieren mit double wird ungenau Java Basics - Anfänger-Themen 4
K Von einem Double wert nur die Zahl vor dem Komma verwenden Java Basics - Anfänger-Themen 9
F Double neu formatieren mit NumberFormat Java Basics - Anfänger-Themen 2
M Double-Ausgabe in JTextField fehlerhaft Java Basics - Anfänger-Themen 2
T Problem mit double-Formatierung Java Basics - Anfänger-Themen 3
M Double Zahl in Grad Zahl Java Basics - Anfänger-Themen 7
M Datentypen Ergebniss- Double to String- wird nicht angezeigt Java Basics - Anfänger-Themen 13
S Double mithilfe eines Scanners so einlesen, dass ich damit rechnen kann Java Basics - Anfänger-Themen 4
M Die Double-Variable rundet? Java Basics - Anfänger-Themen 1
llabusch Methoden Methoden überlagern - entweder int || double Java Basics - Anfänger-Themen 10
S Double, int, Berechnung Java Basics - Anfänger-Themen 3
K Datentypen Wertebereich float/double - Warum nicht hoch -1 Java Basics - Anfänger-Themen 6
A Double[] Array zahlen per Argument übergeben Java Basics - Anfänger-Themen 5
B Erste Schritte Addition von double in switch-Anweisung Java Basics - Anfänger-Themen 2
D Unterschied zwischen double und Double Java Basics - Anfänger-Themen 4
M Double-Zahlen auf Intervalle runden Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben