Comment puis-je mesurer la durée de fonctionnement d'une fonction?

je veux voir combien de temps l'exécution d'une fonction. Donc j'ai 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 ça ne compte pas. Pourquoi?

35
demandé sur Venkat 2012-04-11 17:42:03

10 réponses

pour éviter des problèmes futurs 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 c'est la mauvaise approche. Vous devez utiliser le chronomètre (système.Diagnostic) classe parce que c'est un high resolution timer et le mot Diagnostic dit tout.

alors essayez 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);
43
répondu Omar 2013-01-31 17:19:44

N'utilisez pas de minuterie - 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
43
répondu Oded 2012-04-11 13:44:08

vous devez utiliser la classe de 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
répondu james lewis 2017-08-29 15:23:09

la meilleure façon de voir combien de temps un peu de code prend à courir 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

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

10
répondu Alain 2012-04-11 13:43:55

Visual Studio 2015 , 2017 Professionnel et L'entreprise a Outil de diagnostic. Si vous avez un point de rupture à la fin de votre fonction, il affichera l'heure et la durée sous L'onglet Events comme indiqué dans l'image:

Enter image description here

vous pouvez voir l'article outils de Diagnostic débogueur fenêtre dans Visual Studio 2015 pour plus de détails.

PS; jusqu'à présent seulement Xamarin formes, cross platform project ne supporte pas cette fonctionnalité. Je souhaite que Microsoft apporte cette grande fonctionnalité pour xamarin forms projets.

9
répondu batmaci 2017-12-15 16:22:27

utiliser Chronomètre du système.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
répondu Nikhil Agrawal 2016-04-22 11:09:59

pour chronométrer une fonction, vous devez utiliser le la classe de Chronomètre

aussi, la raison pour laquelle votre minuterie ne compte pas est que vous n'avez pas mis d'intervalle pour cela.

6
répondu Matt Burland 2012-04-11 13:44:16

peut-être, vous pourriez écrire une méthode comme ça:

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 l'utiliser comme ça:

Time(()=>
{
 CallOfTheMethodIWantToMeasure();
});
4
répondu Philippe 2014-03-23 16:05:24

j'ai examiné et accepté toutes les suggestions. Mais nous voulions 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 tout de même mesurer le temps d'exécution pour plusieurs méthodes.

la raison principale pour ne pas mettre en œuvre logger de manière générique est - l'exécution de la méthode est entre deux chronomètres.Start () et chronomètre.Stop () Nous pouvons également exiger le résultat de la méthode après l'exécution pour un traitement ultérieur.

donc pour aborder cette question j'ai créé après la mise en œuvre de l'échantillon où le temps D'exécution est enregistré séparément sans le mélanger avec le flux de la méthode réelle.

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);
}

L'Appel De La Partie:

 static void Main()
 {
    ILogger log = new Log();
    Arithmatic obj = new Arithmatic(log);
    obj.Calculate(10, 3);
    Console.ReadLine();
 }
1
répondu Sumit Deshpande 2016-09-02 03:17:08

enregistrer l'heure à laquelle 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
répondu Harshit Gupta 2017-09-22 12:23:33