web-dev-qa-db-fra.com

Comment mesurer la durée d'exécution d'une fonction?

Je veux voir combien de temps une fonction fonctionne. J'ai donc ajouté un objet timer sur mon formulaire, et je suis sorti avec ce code:

private int counter = 0;

// Inside button click I have:
timer = new Timer();
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
Result result = new Result();
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia);
timer.Stop();

Et:

private void timer_Tick(object sender, EventArgs e)
{
    counter++;
    btnTabuSearch.Text = counter.ToString();
}

Mais cela ne compte rien. Pourquoi?

39
sebastian.roibu

Pour éviter de futurs problèmes avec une minuterie, voici le bon code:

timer = new Timer();
timer.Tick += new EventHandler(timer_Tick);
timer.Interval = 1; //set interval on 1 milliseconds
timer.Enabled = true; //start the timer
Result result = new Result();
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia);
timer.Enabled = false; //stop the timer

private void timer_Tick(object sender, EventArgs e)
{
   counter++;
   btnTabuSearch.Text = counter.ToString();
}

Mais ce n'est pas la bonne approche. Vous devez utiliser la classe Chronomètre (System.Diagnostic) car c'est un minuteur haute résolution et le mot Diagnostic dit tout.

Essayez donc ceci:

Stopwatch timer = Stopwatch.StartNew();

Result result = new Result();
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia);

timer.Stop();  
TimeSpan timespan = timer.Elapsed;

btnTabuSearch.Text = String.Format("{0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds / 10);
50
Omar

N'utilisez pas de minuteur - utilisez la classe Stopwatch .

var sw = new Stopwatch();
Result result = new Result();

sw.Start();
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia);

sw.Stop();

// sw.Elapsed tells you how much time passed
45
Oded

La meilleure façon de voir la durée d'exécution d'un peu de code est d'utiliser System.Diagnostics.Stopwatch.

Voici un exemple:

using System.Diagnostics;

#if DEBUG
     Stopwatch timer = new Stopwatch();
     timer.Start();
#endif

     //Long running code

#if DEBUG
     timer.Stop();
     Debug.WriteLine("Time Taken: " + timer.Elapsed.TotalMilliseconds.ToString("#,##0.00 'milliseconds'"));
#endif

Je utilise le #if DEBUG pour vous assurer que le code du chronomètre n'entre pas dans la version de production, mais vous pouvez vous en passer.

11
Alain

Vous devez utiliser la classe chronomètre pour les fonctions de chronométrage.

Essayez ce qui suit:

private int counter = 0;

// setup stopwatch and begin timing
var timer = System.Diagnostics.Stopwatch.StartNew();

Result result = new Result();
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia);

// stop timer and get elapsed time
timer.Stop();
var elapsed = timer.Elapsed;

// display result time
MessageBox.Show(elapsed.ToString("mm':'ss':'fff"));
11
james lewis

Visual Studio 2015 , 2017 Professional et Enterprise ont un outil de diagnostic. Si vous avez un point d'arrêt à la fin de votre fonction, il affichera l'heure et la durée sous l'onglet Événements comme indiqué dans l'image:

Enter image description here

Vous pouvez voir l'article fenêtre de débogage des outils de diagnostic dans Visual Studio 2015 pour plus de détails.

PS; Jusqu'à présent, seuls les formulaires Xamarin, le projet multiplateforme ne prennent pas en charge cette fonctionnalité. Je souhaite que Microsoft apporte également cette grande fonctionnalité pour les projets de formulaires xamarin.

11
batmaci

Utilisez Chronomètre de System.Diagnostics:

static void Main(string[] args)
{
    Stopwatch stopWatch = new Stopwatch();
    stopWatch.Start();
    Thread.Sleep(10000);
    stopWatch.Stop();

    // Get the elapsed time as a TimeSpan value.
    TimeSpan ts = stopWatch.Elapsed;

    // Format and display the TimeSpan value.
    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
        ts.Hours, ts.Minutes, ts.Seconds,
        ts.Milliseconds / 10);
    Console.WriteLine("RunTime " + elapsedTime);
}
7
Nikhil Agrawal

Pour chronométrer une fonction, vous devez utiliser la classe chronomètre

De plus, la raison pour laquelle votre minuterie ne compte pas est que vous ne lui avez pas défini d'intervalle.

6
Matt Burland

Peut-être pourriez-vous écrire une méthode comme celle-ci:

public static void Time(Action action)
{
    Stopwatch st = new Stopwatch();
    st.Start();
    action();
    st.Stop();
    Trace.WriteLine("Duration:" + st.Elapsed.ToString("mm\\:ss\\.ff"));
}

Et utilisez-le comme ça:

Time(()=>
{
 CallOfTheMethodIWantToMeasure();
});
4
Philippe

J'ai examiné et accepté toutes les suggestions. Mais je voulais partager une implémentation générique pour l'enregistreur de temps d'exécution où nous ne voulons pas implémenter la logique du chronomètre plusieurs fois mais voulons toujours mesurer le temps d'exécution pour plusieurs méthodes.

La principale raison pour ne pas implémenter l'enregistreur de manière générique est - l'exécution de la méthode se situe entre stopwatch.Start () et stopwatch.Stop (), nous pouvons également exiger le résultat de la méthode après l'exécution pour un traitement ultérieur.

Pour résoudre ce problème, j'ai créé un exemple d'implémentation où le temps d'exécution est enregistré séparément sans le mélanger avec le flux de méthode réel.

public static class Helper
{
    public static T Time<T>(Func<T> method, ILogger log)
    {
        var stopwatch = new Stopwatch();
        stopwatch.Start();
        var result = method();
        stopwatch.Stop();
        log.Info(string.Format("Time Taken For Execution is:{0}", stopwatch.Elapsed.TotalMilliseconds));
        return result;
    }
}

public class Arithmatic
{
    private ILogger _log;
    public Arithmatic(ILogger log)//Inject Dependency
    {
        _log = log;
    }

    public void Calculate(int a, int b)
    {
        try
        {
            Console.WriteLine(Helper.Time(() => AddNumber(a, b), _log));//Return the result and do execution time logging
            Console.WriteLine(Helper.Time(() => SubtractNumber(a, b), _log));//Return the result and do execution time logging
        }
        catch (Exception ex)
        {
            _log.Error(ex.Message, ex);
        }
    }

    private string AddNumber(int a, int b)
    {
        return "Sum is:" + (a + b);
    }

    private string SubtractNumber(int a, int b)
    {
        return "Subtraction is:" + (a - b);
    }
}

public class Log : ILogger
{
    public void Info(string message)
    {
        Console.WriteLine(message);
    }

    public void Error(string message, Exception ex)
    {
        Console.WriteLine("Error Message:" + message, "Stacktrace:" + ex.StackTrace);
    }
}

public interface ILogger
{
    void Info(string message);
    void Error(string message, Exception ex);
}

Partie appelante:

 static void Main()
 {
    ILogger log = new Log();
    Arithmatic obj = new Arithmatic(log);
    obj.Calculate(10, 3);
    Console.ReadLine();
 }
2
Sumit Deshpande

enregistrer le moment où l'étape en cours commence à traiter

DateTime dtStart = DateTime.Now;

//Calculate the total number of milliseconds request took (Timespan = to represent the time interval)-> current - started time stamp ...
//TotalMilliseconds -->Gets the value of the current TimeSpan structure expressed in whole and fractional milliseconds.
// to measure how long a function is running 
var result=((TimeSpan)(DateTime.Now - dtStart)).TotalMilliseconds.ToString("#,##0.00") + "ms";
1
Harshit Gupta