Do czasu Java 8 używano dość pokrętnych metod sprawdzania szybkości wykonywania kodu. Od czasu Java 8 jest to zdecydowanie prostsze.
Przykład w klasie Listing107:

package dt20.java_time_duration;

import java.time.Duration;
import java.time.Instant;
import java.util.Random;

public class Listing107 {
    public static void main(String[] args) {
        Instant start = Instant.now();
        Random random = new Random();
        long[] values = random.longs(10_000_000).toArray();
        long min = Long.MAX_VALUE;
        long max = Long.MIN_VALUE;
        for(long a : values){
            min = Math.min(min, a);
            max = Math.max(max, a);
        }
        Instant end = Instant.now();
        long millis = Duration.between(start, end).toMillis();
        System.out.println("Czas wykonania w ms: " + millis);
        System.out.println("max: " + max);
        System.out.println("min: " + min);
    }
}

Tworzymy tablicę zawierającą 10 mln liczb losowych. Potem (w nieuporządkowanej tablicy) wyszukujemy wartość minimalną i maksymalną.
Po wykonaniu kodu zobaczymy coś podobnego do:

Czas wykonania w ms: 317
max: 9223371249623486320
min: -9223370964566974940

Cała metoda sprowadza się do trzech linii kodu:

 Instant start = Instant.now();
 //testowany kod
 Instant end = Instant.now();
 long millis = Duration.between(start, end).toMillis();

W razie potrzeby czas możemy przeliczyć na inne jednostki np. na nanosekundy, etc.