不那么详细的秒表

时间:2013-12-30 20:55:03

标签: c# .net logging performance-testing stopwatch

我最近遇到了js-land的一对函数,我更喜欢这样:

console.time("CalcPrimes");
// Go calculate primes
console.timeEnd("CalcPrimes");
// Outputs something like > CalcPrimes: 2150ms

在幕后,它是simple dictionary,记录开始时间戳,并通过从结束时间减去开始时间来打印持续时间。

将其与.NET代码进行比较:

var sw = new Stopwatch();
sw.Start();
// Go calculate primes
sw.Stop();
Trace.WriteLine("CalcPrimes:" + sw.ElapsedMilliseconds);

我的天真代码需要两倍的行来做同样的事情(注意:你可以只用两个)。但是,我仍然需要手动格式化输出。当我必须将非核心逻辑注入我的应用程序时,我希望尽可能减少杂乱。大多数情况下,我反对重复的逻辑来格式化输出到处可能的时间。


  1. 在.NET世界中是否存在现有解决方案以获得更简洁的计时器/秒表?
  2. 如果没有,在创建js代码的类似解决方案时,我应该注意有什么危险? (或者,我应该使用Dictionary<String, Stopwatch>而不是因精确问题而保存Date.Now吗?

2 个答案:

答案 0 :(得分:4)

如何编写像

这样的辅助方法
long ElapsedMilliseconds(int n, Action action)
{
    action(); 
    var sw = Stopwatch.StartNew();
    for (int i = 0; i < n; i++)
    {
        action();
    }
    return sw.ElapsedMilliseconds;
}

并将其命名为

var duration = ElapsedMilliseconds(5, ()=>CalculatePrimes());

答案 1 :(得分:3)

这个怎么样:

var sw = Stopwatch.StartNew();
// Go calculate primes
Trace.WriteLine("CalcPrimes: {0} ms", sw.ElapsedMilliseconds);

我发现此扩展程序很有用:

public static class StopwatchExt
{
    public static string GetTimeString(this Stopwatch stopwatch, int numberofDigits = 1)
    {
        double s = stopwatch.ElapsedTicks / (double)Stopwatch.Frequency;
        if (s > 1)
            return Math.Round(s, numberofDigits) + " s";
        if (s > 1e-3)
            return Math.Round(1e3 * s, numberofDigits) + " ms";
        if (s > 1e-6)
            return Math.Round(1e6 * s, numberofDigits) + " µs";
        if (s > 1e-9)
            return Math.Round(1e9 * s, numberofDigits) + " ns";
        return stopwatch.ElapsedTicks + " ticks";
    }
}