我最近遇到了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);
我的天真代码需要两倍的行来做同样的事情(注意:你可以只用两个)。但是,我仍然需要手动格式化输出。当我必须将非核心逻辑注入我的应用程序时,我希望尽可能减少杂乱。大多数情况下,我反对重复的逻辑来格式化输出到处可能的时间。
Dictionary<String, Stopwatch>
而不是因精确问题而保存Date.Now
吗?答案 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";
}
}