Pour comprendre ce qui suit, mieux vaut avoir une familiarité avec le code générique, les λ et les uplets en C#.
Mesurer le temps d'exécution d'une fonction est une tâche récurrente en programmation. L'algorithme général est d'ailleurs assez simple :
S'il est difficile d'écrire une solution générale à ce problème en C#, faute d'avoir accès à des fonctions véritablement variadiques, il est possible d'écrire des solutions génériques ponctuelles. Ce qui suit en présente deux, soit une pour mesurer le temps d'exécution d'une fonction void sans paramètres une autre pour mesurer le temps d'exécution d'une fonction sans paramètre et retournant un T. Vous pourrez adapter le tout à d'autres signatures.
Une fonction void se modélise en C# par un Action ou par un délégué. J'utiliserai un Action<T> ici, dans le but de garder l'exemple simple :
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
long écoulé = Tester(n => Thread.Sleep(n), 500);
Console.WriteLine($"Exécution en {écoulé} ms");
static long Tester<T>(Action<T> a, T arg)
{
var sw = new Stopwatch();
sw.Start();
a(arg);
sw.Stop();
return sw.ElapsedMilliseconds;
}
Cet exemple mesure le temps de l'appel a(arg), qui se limitera à dormir arg millisecondes. Le temps écoulé sera donc d'au moins arg millisecondes (typiquement un peu plus).
Pour une fonction non-void, on peut adapter le modèle. Par exemple, pour une fonction sans paramètre retournant un T, on aurait :
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
var (rés, dt) = Tester(() =>
{
Thread.Sleep(500);
return 3;
});
Console.WriteLine($"Calculé {rés} en {dt} ms");
static (T rés, long dt) Tester<T>(Func<T> f)
{
var sw = new Stopwatch();
sw.Start();
T rés = f();
sw.Stop();
return (rés, sw.ElapsedMilliseconds);
}
C'est le genre de fonction qui est souvent utile...