1

我想测试一个方法运行需要多长时间,我想知道时间跨度是否是最好的方法?我不想记录方法的开始和结束,因为我听说记录不会给出准确的时间读数,因为创建和更新现有日志文件需要时间。如果时间跨度不是最好的方法,关于什么是这样做的好方法有什么建议吗?

4

5 回答 5

6

最好使用专为此类事情设计的 Stopwatch 类。

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
DoSomething();
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
于 2012-10-11T17:49:25.340 回答
3
var duration = Measure(() => YourFunction(param1));

long Measure(Action action)
{
    Stopwatch sw = Stopwatch.StartNew();
    action();
    return sw.ElapsedMilliseconds;
}
于 2012-10-11T17:52:24.540 回答
2

Stopwatch用来计时我的代码。

 var sw = new Stopwatch();
 sw.Start()
 //code to time here
 sw.Stop();
 Console.WriteLine("Time taken in milliseconds: " + sw.ElapsedMilliseconds);

您可以使用秒表对您的时间安排非常感兴趣。我用它来测试嵌套执行,以及平均多个循环迭代所花费的时间。

要测试多次迭代,请执行以下操作:

var sw = new Stopwatch();
List<long> totalTime = new List<long>();

for (var u = 0; u < 100000; u++)
{
    sw.Start();
    //logic here
    sw.Stop();
    totalTime.Add(sw.ElapsedMilliseconds);
    sw.Reset();
}
Console.WriteLine("Average time in Milliseconds: {0}", totalTime.Average());
于 2012-10-11T17:48:56.137 回答
2

您想使用 Stopwatch 类。

于 2012-10-11T17:49:20.980 回答
2

你应该使用这个Stopwatch类:

public void Foo()
{
    var sw = Stopwatch.StartNew();
    // Do work...
    var totalTime = sw.Elapsed;
}

我经常让自己成为一个实用的方法来处理这个问题:

public static void ComputeTimings(Action method, string methodName)
{
    var sw = Stopwatch.StartNew();
    method();
    sw.Stop();
    Debug.WriteLine("Method {0} took {1}", methodName, sw.Elapsed);
}

这可以称为:

ComputeTimings(() => Foo(bar), "Foo");

这很好,因为您可以将时间“注入”到您的代码中并根据需要将其删除,而无需更改您的实际方法主体。

另请注意,对于非常准确的计时,您通常需要至少执行该方法两次。方法第一次运行时,由于 JIT 编译器的原因,计时可能会关闭。如果您选择,您可以将其构建到上述方法中,即:

public static void ComputeTimings(Action method, string methodName, bool executeOnceFirst = true)
{
    if (executeOnceFirst) 
        method();

    var sw = Stopwatch.StartNew();
    method();
    sw.Stop();
    Debug.WriteLine("Method {0} took {1}", methodName, sw.Elapsed);
}
于 2012-10-11T17:50:29.597 回答