Je suis en train d'implémenter un certain nombre d'algorithmes de tri en Java, et j'aimerais pouvoir chronométrer et comparer chaque algorithme. À l'heure actuelle, j'ai un script que chaque fois algorithme séparément, avec une énorme quantité de redondance de code:Passer des méthodes à un programme de test en Java
long min = 1000000;
long startTime;
long endTime;
QuickSort quicksorter = new QuickSort();
for (int i = 0; i != 10000; ++i) {
startTime = System.nanoTime();
quicksorter.sort();
endTime = System.nanoTime();
if ((endTime - startTime) < min)
min = endTime - startTime;
}
System.out.printf("Quicksort min time is %d ns.\n", min);
BinaryInsertionSort binarysorter = new BinaryInsertionSort();
min = 1000000;
for (int i = 0; i != 10000; ++i) {
startTime = System.nanoTime();
binarysorter.sort();
endTime = System.nanoTime();
if ((endTime - startTime) < min)
min = endTime - startTime;
}
System.out.printf("Binary insertion sort min time is %d ns.\n", min);
Avec six ou sept algorithmes de tri différents, cela commence à se sentir extrêmement inefficace. La solution évidente « python-esque » serait de définir une méthode qui prend des méthodes comme paramètres et les temps eux comme ceci:
long timeit(function func) {
min = 1000000;
for (int i = 0; i != 10000; ++i) {
startTime = System.nanoTime();
func();
endTime = System.nanoTime();
if ((endTime - startTime) < min)
min = endTime - startTime;
}
System.out.printf("Min execution time is %d ns.\n", min);
}
Cependant, je crois qu'il est à déconseiller (et pratique) pour passer des méthodes comme paramètres Java, et le faire génériquement pourrait être impossible. Je suppose que chaque classe de tri peut hériter d'une classe abstraite qui implémente une méthode de benchmarking, mais y a-t-il une meilleure façon d'y parvenir en Java?
Il suffit d'utiliser JMH: http://tutorials.jenkov.com/java-performance/jmh.html#your-first-jmh-benchmark – millimoose