54

関数が実行されている時間を確認したい。そこで、フォームにタイマーオブジェクトを追加すると、次のコードが出てきました。

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

しかし、これは何も数えていません。なんで?

4

11 に答える 11

57

タイマーに関する将来の問題を回避するために、正しいコードは次のとおりです。

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

しかし、それは間違ったアプローチです。Stopwatch(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);
于 2012-04-11T14:10:33.780 に答える
53

タイマーを使用しないでください-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
于 2012-04-11T13:44:08.723 に答える
14

コードの実行にかかる時間を確認する最良の方法は、を使用すること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ストップウォッチコードが製品リリースに含まれないようにするためにを使用しますが、それがなくても可能です。

于 2012-04-11T13:43:55.707 に答える
14

Visual Studio 2015、2017 ProfessionalandEnterpriseには診断ツールがあります。関数の最後にブレークポイントがある場合は、画像に示すように、[イベント]タブに時間と期間が表示されます。

ここに画像の説明を入力してください

詳細については、VisualStudio2015の診断ツールデバッガウィンドウの記事を参照してください。

PS; これまでのところ、Xamarinフォームのみであり、クロスプラットフォームプロジェクトはこの機能をサポートしていません。Microsoftがxamarinフォームプロジェクトにもこの優れた機能を提供することを願っています。

于 2015-12-23T15:55:50.447 に答える
11

タイミング関数にはストップウォッチクラスを使用する必要があります。

次のことを試してください。

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"));
于 2012-04-11T13:46:13.620 に答える
8

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);
}
于 2012-04-11T13:46:08.237 に答える
6

関数のタイミングについては、ストップウォッチクラスを使用する必要があります

また、タイマーがカウントされない理由は、タイマーの間隔を設定しなかったためです。

于 2012-04-11T13:44:16.303 に答える
4

おそらく、次のようなメソッドを作成できます。

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();
});
于 2014-03-23T16:05:24.393 に答える
3

私はすべての提案を検討し、同意しました。しかし、Stopwatchロジックを複数回実装したくないが、複数のメソッドの実行時間を測定したい実行時間ロガーの1つの一般的な実装を共有したいと考えていました。

一般的な方法でロガーを実装しない主な理由は、メソッドの実行がstopwatch.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();
 }
于 2016-09-01T18:02:54.877 に答える
1

現在のステップが処理を開始する時間を記録します

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";
于 2017-09-22T11:52:22.107 に答える
1

コードのデバッグ時にブレークポイント間の経過ミリ秒を表示するために、Visual StudioにはPerfTipsが用意されています。これは、組み込みの便利で高速なツールです。

于 2021-04-26T14:05:12.850 に答える