Sortieralgorithmus mit Systemzeit messen

deggit_biber

Aktives Mitglied
Hallo,
Ich würde gerne wissen wie lange mein Sortieralgorithmus braucht.
Die folgende Methode gibt mir die Systemzeit an System.currentTimeMillis(); aber wie baue ich die in meinen Code ein?

Hier mal mein Code
Code:
public class Sortieren
{
    private int [] arrB;
    int temp;
   
    public Sortieren(int parrGroesse)
    {
        arrB = new int [parrGroesse];
       
        for (int i=0; i < arrB.length; i++)
        {
            arrB[i] = (int) (Math.random() * 1000);     
        } 
    }

public void insertionSortB()
    {
        int insertionSortVertauschungen = 0;
       
        for(int i=1; i < arrB.length; i++)
        {
            int insertion = arrB[i];
            int j = i;
                       
            while(j > 0 && arrB[j-1] > insertion)
            {
                insertionSortVertauschungen = insertionSortVertauschungen + 1;

                arrB[j] = arrB[j-1];
                j--;
            }
            arrB[j] = insertion;
        }
       
        System.out.println("InsertionSort / arrAayGröße: " +arrB.length);
        for (int i=0; i < arrB.length; i++)
        {
            System.out.print(arrB[i] + ", ");
        }
        System.out.println();
        System.out.println("Vertauschungen: " +insertionSortVertauschungen);
        System.out.println();
        System.currentTimeMillis();  //???????????????????????????????????
    }
}

vielen lieben Dank für euer Hilfe!!!

LG
Deggit
 
Zeit davor und Zeit danach merken, der Unterschied dazwischen ist die Laufzeit 😉

Allerdings sollte man bei solchen Benchmarks noch einiges mehr beachten, System.currentTimeMillis zB ist eher ungeeignet...
 
Ok einfach eine Variable stellen

long zeitvorher = System.currentTimeMillis();

und eine
long zeitnachher = System.currentTimeMillis();

dann
long zeit = zeitnachher - zeitvorher;

richtig?

was sollte ich den sonst noch beachten?

Wenn ich das so machen, gibt er mir bei einen Array der Größe 1000
eine 9 an!
9 Millisekunden? Komisch
 
  • System.currentTimeMillis ist oft zu ungenau, stattdessen sollte man nanoTime() verwenden.

  • Für vernünftige Ergebnisse muss man die Funktion erst einige Male warmlaufen lassen, damit der JIT optimiere kann.

  • Die Messung sollte man n mal machen, und dann die Zeiten mitteln. Bei einem einzelnem Durchlauf kann uU kurzzeitig erhöhte Systemlast durch andere Prozesse oder GC zu stark verfälschten Ergebnissen führen
 
Für so Microbenchmarks benutzt man ordentliche Tools wie z.B. JMH. Wenn man das händisch macht, hat man nur einen Richtwert, da man auch JVM Aktivität mit misst!
 
muss man die Funktion erst einige Male warmlaufen lassen
Wenn man das händisch macht, hat man nur einen Richtwert, da man auch JVM Aktivität mit misst
Diese ganzen Messungen machen eh nur Sinn um verschiedene Algorithmen miteinander zu vergleichen bzw. um ihre Komplexität zu verifizieren. Wenn du den Algorithmus später irgendwo in einer Applikation verwendest wird er vermutlich auch nicht warmlaufen bzw. hast du immer JVM-Aktivität mit drin.
 
Diese ganzen Messungen machen eh nur Sinn um verschiedene Algorithmen miteinander zu vergleichen bzw. um ihre Komplexität zu verifizieren. Wenn du den Algorithmus später irgendwo in einer Applikation verwendest wird er vermutlich auch nicht warmlaufen bzw. hast du immer JVM-Aktivität mit drin.

In den meisten Anwendungen laufen solche Funktionen durchaus häufiger, und damit bekommt auch der JIT Gelegenheit zum optimieren. Die ersten n Durchläufe sind meistens egal, sind aber um einiges langsamer, als der Durchschnitt und zögen den ziemlich runter, von daher macht warmlaufen schon Sinn.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben