Как измерить, как долго работает функция?

Я хочу посмотреть, как долго работает функция. Поэтому я добавил объект таймера в свою форму, и я вышел с этим кодом:

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

и

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

Но это ничего не значит. Почему?

Ответ 1

Чтобы избежать будущих проблем с таймером, вот правильный код:

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

Но это неправильный подход. Вы должны использовать класс Секундомер (System.Diagnostic), потому что он Таймер высокого разрешения, и слово Diagnostic говорит все.

Итак, попробуйте следующее:

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

Ответ 2

Не используйте таймер - используйте класс 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

Ответ 3

Вы должны использовать класс секундомера для функций синхронизации.

Попробуйте следующее:

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

Ответ 4

Лучший способ узнать, сколько времени потребуется на выполнение кода, - использовать System.Diagnostics.Stopwatch.

Вот пример:

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

Я использую #if DEBUG, чтобы код секундомера не попадал в производственный выпуск, но вы могли обойтись без него.

Ответ 5

Используйте Stopwatch 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);
}

Ответ 6

Для синхронизации функции вы должны использовать Секундомер класса

Кроме того, причина, по которой ваш таймер не учитывается, заключается в том, что вы не установили для него интервал.

Ответ 7

Visual Studio 2015, 2017 Professional и Enterprise имеют диагностический инструмент. Если у вас есть точка останова в конце вашей функции, она отображает время и продолжительность на вкладке "События", как показано на изображении:

Введите описание изображения здесь

Подробнее о окне отладки диагностических инструментов в Visual Studio 2015.

PS; Пока что только Xamarin формирует, кросс-платформенный проект не поддерживает эту функцию. Я желаю, чтобы Microsoft предоставила эту замечательную возможность для проектов форм xamarin.

Ответ 8

Возможно, вы могли бы написать такой метод:

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

И используйте его так:

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

Ответ 9

Я рассмотрел и согласился со всеми предложениями. Но хотелось бы поделиться одной универсальной реализацией для журнала времени выполнения, когда мы не хотим многократно реализовывать логику секундомера, но все же хотим измерить время выполнения для нескольких методов.

Основная причина не в том, чтобы реализовать логгер в общем виде - это выполнение метода между секундомерным .Start() и stopwatch.Stop() также может потребоваться результат метода после выполнения для дальнейшей обработки.

Итак, чтобы решить эту проблему, я создал следующую примерную реализацию, где время выполнения регистрируется отдельно, не смешивая его с фактическим потоком метода.

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

Вызывающая часть:

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

Ответ 10

записать время начала текущего шага

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";

Ответ 11

Попробуйте следующим образом:

    this.Cursor = Cursors.WaitCursor;

    System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();

   //YOUR CODE - CALL FUNCTION -- OTHER COMPUTATIONS

   long elapsed = sw.ElapsedMilliseconds; // or sw.ElapsedTicks

   this.Cursor = Cursors.Default;
   lblTimeNew.Text = "Time: " + elapsed.ToString();

Для получения дополнительной информации посетите официальный сайт MSDN

https://msdn.microsoft.com/it-it/library/system.diagnostics.stopwatch(v=vs.110).aspx