WTF?! Algorithmus-Geschwindigkeitstest

SuperSeppel13

Bekanntes Mitglied
Hallo Leute,
ich bin vorhin im Internet über den "fast inverse square root"-Algorithmus gestolpert. Da ich womöglich einen Nutzen dafür hätte wollte ich ihn dann erst mal auf Leistung testen.

Dazu habe ich eine Testmethode geschrieben, die zuerst ein Array mit einer anzahl n an zufälligen floats von 0 bis 10000 anlegt.
Danach lasse ich mir von jedem dieser Werte die inverse Quadratwurzel berechnen, und zwar im ersten Durchlauf einfach mit
Code:
1f/(float)Math.sqrt(x)
und im zweiten mit dem invSqrt-Algorithmus (siehe unten).
Zwischen beiden Durchläufen habe ich mir jeweils die
Code:
System.nanoTime()
geben lassen und habe dann im Nachhinein die Dauer beider durchläufe berechnet.

Das erstaunliche hierbei war, dass der "schnelle" Algorithmus auch bei wiederholtem Test bis zu vier mal so lang gebraucht hat.
Als ich dann die Methode dahingehend änderte, dass bei jedem Programmdurchlauf gleich hundert Testdurchläufe gemacht werden, stellte ich fest, dass bei einem Test mit n<1000 Werten pro Durchlauf immer so bei den ersten zwei oder drei tests die invSqrt methode langsamer ist und bei allen danach aber ca 5 mal so schnell! (bei kleineren n sind auch mehr langsame Durchläufe am Anfang.)

Kann mir das irgendwer erklären?! Ich dachte dass die JVM vielleicht noch irgendwas laden muss, aber wieso verlangsamt dass dann die einem Methode aber nicht die andere (oder zumindest unterschiedlich stark)?!

Hier ist nochmal der Algorithmus:
Java:
    public static float invSqrt(float x){
        float xhalf = 0.5f * x;
        int i = Float.floatToRawIntBits(x); // store floating-point bits in integer
        i = 0x5f3759df - (i >> 1); // initial guess for Newton's method
        x = Float.intBitsToFloat(i); // convert new bits into float
        x = x*(1.5f - xhalf*x*x); // One round of Newton's method
        //x = x*(1.5f - xhalf*x*x); // optional second round, slower/more accurate
        return x;
    }

und hier mein ganzer code, falls ihr das auch mal testen wollt:

Java:
public class Test {

    public static void main (String[] args){
        int l = 100;
        double sum = 0;

        for(int i=0; i<100; i++){
            sum += test();
        }

        System.out.println();
        System.out.println("average: " + sum/l);//durchschnitt prozentuale zeitersparnis

    }

    static double test(){
        final int l = 10000;//test-länge
        float[] f = new float[l];
        long start, half, end;
        float sol;

        for(int i = 1; i<l; i++){
            f[i] = (float)Math.random()*10000f;//zufallszahlen generieren
        }

        start = System.nanoTime();

        //durchlauf mit standart methode
        for(int i=0; i<l; i++){
            sol = 1f/(float)Math.sqrt(f[i]);
        }

        half = System.nanoTime();

        //durchlauf mit invSqrt
        for(int i=0; i<l; i++){
            sol = invSqrt(f[i]);
        }

        end = System.nanoTime();

        long t1 = half-start;//länge erster durchlauf
        long t2 = end-half;//länge zweiter durchlauf
        double d = (1d-(double)t2/t1)*100;//geschw.-zunahme in prozent
        
        System.out.println(t1/1000000d);//in millisec
        System.out.println(t2/1000000d);
        System.out.println(d);
        System.out.println();

        return d;
    }

    public static float invSqrt(float x){
        float xhalf = 0.5f * x;
        int i = Float.floatToRawIntBits(x); // store floating-point bits in integer
        i = 0x5f3759df - (i >> 1); // initial guess for Newton's method
        x = Float.intBitsToFloat(i); // convert new bits into float
        x = x*(1.5f - xhalf*x*x); // One round of Newton's method
        //x = x*(1.5f - xhalf*x*x); // One round of Newton's method
        return x;
    }
}

Ich werd den algorithmus auf jeden fall verwenden, aber interessieren tuts mich doch... =)

Grüße,
SuperSeppel13
 

Marco13

Top Contributor
Als ich dann die Methode dahingehend änderte, dass bei jedem Programmdurchlauf gleich hundert Testdurchläufe gemacht werden, stellte ich fest, dass bei einem Test mit n<1000 Werten pro Durchlauf immer so bei den ersten zwei oder drei tests die invSqrt methode langsamer ist und bei allen danach aber ca 5 mal so schnell! (bei kleineren n sind auch mehr langsame Durchläufe am Anfang.)

Ohne das ganze im Detail nachvollzogen zu haben, aber MIT dem Hinweis, dass solche selbsgebastelten "Micro-Benchkarks" immer sehr heikel sind (und speziell bei sol "elementaren" Operationen wie 1/sqrt nur sehr bedingt überhaupt eine Aussagekraft haben) : Der beschriebene Effekt könnte (!) durch den JIT (Just-In-Time-Compiler) kommen. (Websuche). Der optimiert den Code noch, "während" er läuft, und konzentriert sich dabei auf Dinge, die "oft" ausgeführt werden.
 

SuperSeppel13

Bekanntes Mitglied
Hm, ja, dass das mein Test n bischen improvisiert ist ist mir schon klar, aber die Ergebnisse waren halt bis auf diese Ungereimtheit am Anfang sehr konsistent, weshalb ich drchaus bereit bin, ihnen ein gewisses Vertrauen zu schenken.
Ich habe das ganze jetzt nochmal auf einem anderen Rechner getestet, mit exakt dem gleichen Ergebnis.

Die Erklärung mit dem JIT-Compiler leuchtet mir ein - Danke dafür!
Ich werd mich dazu mal ein wenig näher informieren...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Algorithmus für Arbeit mit fehlenden Listenelementen? Allgemeine Java-Themen 1
schegga_B AES-Algorithmus in javax.crypto Allgemeine Java-Themen 3
M Laufzeit des Prim Algorithmus Allgemeine Java-Themen 3
O Newton Algorithmus Java Allgemeine Java-Themen 1
CptK Backpropagation Algorithmus Allgemeine Java-Themen 6
N Google Authenticator Algorithmus (SHA1) Allgemeine Java-Themen 1
gotzi242 Schatzsuche mithilfe eines O(log n) Algorithmus Allgemeine Java-Themen 2
Zrebna Quicksort-Algorithmus - zufälliges Pivot wählen Allgemeine Java-Themen 6
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
B Algorithmus Warteschlange Ringpuffer wirklich fehlerfrei Allgemeine Java-Themen 8
M Probleme mit Negamax-Algorithmus Allgemeine Java-Themen 29
F Q - Learning Algorithmus Bug Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
M Minmax Algorithmus Verständnisproblem Allgemeine Java-Themen 2
H Rundreise frage (Algorithmus) Allgemeine Java-Themen 18
F KMP-Algorithmus Allgemeine Java-Themen 9
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
P MinMax Algorithmus Allgemeine Java-Themen 0
J Abhängigkeit zwischen Rechenzeit und Speicherbedarf in einen Algorithmus Allgemeine Java-Themen 7
K Djikstra-Algorithmus Allgemeine Java-Themen 1
T Minimax/Alphabeta Algorithmus hängt sich auf (?) Allgemeine Java-Themen 2
M Algorithmus zum Zahlen einteilen Allgemeine Java-Themen 8
O Best Practice Hilfe bei Algorithmus gesucht Allgemeine Java-Themen 10
S Algorithmus um Objekte auf einer Flaeche mit gleichem Abstand anzuordnen..? Allgemeine Java-Themen 20
S Rucksackproblem und genetischer Algorithmus Allgemeine Java-Themen 9
L Abbruch des Algorithmus Allgemeine Java-Themen 8
D Input/Output Ausgleichen chemischer Reaktionsgleichungen mit dem Gauß-Algorithmus Allgemeine Java-Themen 2
Messoras A*-Algorithmus integrieren Allgemeine Java-Themen 3
S Buchscan 3D Dewarp Algorithmus - Ansätze Allgemeine Java-Themen 1
B Verteilungs-/Vergabe-Algorithmus mit abhängigen Score-Werten Allgemeine Java-Themen 3
Androbin "Shunting Yard"-Algorithmus Allgemeine Java-Themen 6
B Algorithmus - Project Euler Problem 18 Allgemeine Java-Themen 2
N Algorithmus zum bewerten von mathematischen Funktionen Allgemeine Java-Themen 11
O Algorithmus Optimierung Allgemeine Java-Themen 3
Joew0815 Algorithmus - Zahlenfolge in 4 ähnliche Teile aufteilen Allgemeine Java-Themen 0
O Tag Cloud Algorithmus Idee gesucht Allgemeine Java-Themen 2
A Implementierung eines Algorithmus (Farthest Insertion zur Lösung des TSP) in O(n²) Allgemeine Java-Themen 2
C Eclipse Probleme bei selbst erstelltem Algorithmus Allgemeine Java-Themen 2
H Graph-Algorithmus gesucht Allgemeine Java-Themen 21
N Algorithmus durch Workflow Allgemeine Java-Themen 7
M tree-based diff Algorithmus (Code-Vergleiche) Allgemeine Java-Themen 3
S Uhrzeit Algorithmus sale Allgemeine Java-Themen 11
N A*-Algorithmus Allgemeine Java-Themen 5
A Suche Algorithmus zum Erstellen eines planaren Graphen Allgemeine Java-Themen 5
F Methoden Algorithmus zur Gegnerfindung (Turnier) Allgemeine Java-Themen 9
T Algorithmus Graph Allgemeine Java-Themen 10
J Algorithmus gesucht (Stringtransformation) Allgemeine Java-Themen 4
B Algorithmus Krankenhausbelegung Allgemeine Java-Themen 17
S Algorithmus von Dijkstra Allgemeine Java-Themen 2
alex_fairytail OOP Banknoten Algorithmus Teil 2 Allgemeine Java-Themen 13
2 ArrayList aktualisieren Algorithmus Allgemeine Java-Themen 11
alex_fairytail Methoden Banknoten Algorithmus Allgemeine Java-Themen 10
R Codehinweise: Algorithmus Größenvergleich von n Zahlen Allgemeine Java-Themen 5
L Algorithmus für kürzesten Weg mit Wegpunkten Allgemeine Java-Themen 21
C Algorithmus Problem in Minesweeper Allgemeine Java-Themen 5
S Algorithmus um Labyrinth zu erzeugen Allgemeine Java-Themen 6
V Problem mit A* Pathfinder-Algorithmus Allgemeine Java-Themen 2
S Algorithmus um nächst folgende Primzahl zu berechnen Allgemeine Java-Themen 7
S Algorithmus Problem. Rechtecke effizient auf Spielfeld anordnen. Allgemeine Java-Themen 7
C Algorithmus-Hilfe Allgemeine Java-Themen 20
J Algorithmus Längenkombinationen? Allgemeine Java-Themen 7
M Kombinationen über rekursiven Algorithmus berechnen? Allgemeine Java-Themen 10
L Algorithmus für Poker-Hände Allgemeine Java-Themen 7
chik 2 return werte für Greedy-Algorithmus (gelöst) Allgemeine Java-Themen 3
D Abstruse Probleme mit eigenem replace Algorithmus Allgemeine Java-Themen 11
P RC4 Algorithmus Allgemeine Java-Themen 3
D RSA Verfahren - Erweiterter Euklidischer Algorithmus Allgemeine Java-Themen 4
C IBAN und Bic Validieren (Algorithmus) Allgemeine Java-Themen 10
P Problem mit A*-Algorithmus Allgemeine Java-Themen 12
M Wörter Algorithmus Allgemeine Java-Themen 7
M Algorithmus für automatische Zeilenumbrüche Allgemeine Java-Themen 12
K Postleitzahlen Algorithmus Allgemeine Java-Themen 12
G Problem mit Algorithmus Allgemeine Java-Themen 3
T Hilfe bei einem Algorithmus Allgemeine Java-Themen 2
S Stemming-Algorithmus gesucht (z.B. Porter) Allgemeine Java-Themen 2
RoliMG präfix zu infix algorithmus Allgemeine Java-Themen 6
Z A*-Algorithmus - Probleme mit offener/geschlossener Liste Allgemeine Java-Themen 7
S Javaimplementierung des MD5 Algorithmus Allgemeine Java-Themen 2
E Container-Pack-Algorithmus Allgemeine Java-Themen 4
G k nearest neighbor algorithmus Allgemeine Java-Themen 7
C HASH Algorithmus 2 Strings ergeben das Selbe. Allgemeine Java-Themen 2
P Page Rank Algorithmus implementieren Allgemeine Java-Themen 7
T Problem RSA-Algorithmus in Java? Allgemeine Java-Themen 2
minzel Hash-Algorithmus Allgemeine Java-Themen 9
Y komprimierung mittels Huffman-Algorithmus, bit-shifting. Allgemeine Java-Themen 2
K Algorithmus Allgemeine Java-Themen 10
C Algorithmus für Array Allgemeine Java-Themen 9
I Verschlüsselung mit Pwd. - User soll Algorithmus wählen Allgemeine Java-Themen 4
J fällt euch ein Algorithmus ein? Allgemeine Java-Themen 4
S Algorithmus für Sudoku Allgemeine Java-Themen 17
N Euklidischer Algorithmus in Java und keine Terminierung. Allgemeine Java-Themen 7
F Algorithmus für Sortierung gesucht Allgemeine Java-Themen 15
T Algorithmus verbessern Allgemeine Java-Themen 10
U Suche Algorithmus zur bestimmung des längsten Wegs Allgemeine Java-Themen 3
U Ford-Fulkerson Algorithmus gesucht Allgemeine Java-Themen 1
U Dijkstra Algorithmus gesucht Allgemeine Java-Themen 4
D Algorithmus für die Erkennung fehlerhafter Eingaben Allgemeine Java-Themen 4
I hash-algorithmus Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben