【问题标题】:Make a method to return Execution Time of another Method使一个方法返回另一个方法的执行时间
【发布时间】:2009-08-27 22:47:55
【问题描述】:

我正在尝试提出一种方法来测量并返回另一种方法的执行时间。基本上是这样的:

public void DoSomething(Int32 aNumber)
{ /* Stuff happens */ }

//
// Somewhere else in code:
TimeSpan executionTime = MyDiag.MeasureExecTime(DoSomething(5));

// Now executionTime contains how long DoSomething(5) took to execute,
// e.g. 2.55463 seconds.

我该怎么做(MeasureExecTime 方法)?

【问题讨论】:

  • 这与 Jeff 关于通过 lambda 测量的问题有何重复?此外,我已经接受了这个问题的答案,你手上的时间太多了?
  • 接受的答案与另一个问题的接受答案几乎相同的事实让我想知道它是否是重复的,仅此而已。无需刻薄。
  • 请问为什么?如果你想做一些快速的基准测试,很好;如果要分析应用程序,请使用分析器。 eqatec.com/tools/profiler 有一个免费的准系统,还有几个功能齐全的商业产品(ANTS、dotTrace)。

标签: c# .net performance


【解决方案1】:

我刚刚在this SO question 中创建了这样一个测试性能的方法:

private static TimeSpan MeasureExecTime(Action action, int iterations)
{
    action(); // warm up
    var sw = Stopwatch.StartNew();
    for (int i = 0; i < iterations; i++)
    {
        action();
    }
    return sw.Elapsed;
}

用法:

MeasureExecTime(() => DoSomething(5), 100000);

如果您不想测试多个迭代,请参阅 280Z28 的答案 :-)

【讨论】:

  • 这也是我的问题。实际上,我从另一个问题的答案(带性能测试)中得到了写这个的想法。大声笑。
  • 您的 for 循环会增加开销并可能会扭曲结果(尽管不是很明显......)。您应该在 action() 之前启动秒表,并在之后暂停
  • @Thomas,它有一些缺陷,但在秒表 startnew 之前调用操作不是其中之一。看我的回答。
【解决方案2】:
public static TimeSpan MeasureExecTime(Action action)
{
    Stopwatch stopwatch = Stopwatch.StartNew();
    action();
    return stopwatch.Elapsed;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    相关资源
    最近更新 更多