不那么冗长的秒表[关闭]
Posted
技术标签:
【中文标题】不那么冗长的秒表[关闭]【英文标题】:Less verbose Stopwatch [closed] 【发布时间】:2014-01-17 19:16:03 【问题描述】:我最近从 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);
我的幼稚代码需要两倍的行数来做同样的事情(注意:你可以只做两行)。但是,我仍然必须手动格式化输出。当我必须将非核心逻辑注入我的应用程序时,我希望尽可能减少混乱。大多数情况下,我反对重复的逻辑来格式化输出,因为我可能会计时。
-
在 .NET 世界中是否有现有的解决方案来减少冗长的计时器/秒表?
如果不是,在创建与 js 代码类似的解决方案时,我应该注意哪些危险? (或者例如,由于精度问题,我应该使用
Dictionary<String, Stopwatch>
而不是保存Date.Now
吗?
【问题讨论】:
您可以将对象实例化和Start
调用重构为静态助手类的新方法,以及Stop
和Trace
调用。但是,真的,这有那么令人反感吗?恕我直言,这几乎不是冗长。
FWIW,你可以使用var sw = Stopwatch.StartNew()
并保存一行。
我同意@Yuck。自己实现这一点并不难,但考虑到多线程的复杂性(JS 没有),C# 的处理方式看起来要好得多。
@Yuck 从答案/cmets 看来,我可以大大减少代码行数。我认为我最反对的是输出格式逻辑的重复。在我开发过的应用程序中,我发现很多不一致的地方(有时甚至是完全不正确的代码),所以我真的很想只做一次。静态辅助方法听起来是正确的选择。
【参考方案1】:
写一个辅助方法怎么样
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 当然,我想我更喜欢return sw.ElapsedMilliseconds/((double)n);
,但这只是一种变化。【参考方案2】:
这个呢:
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";
【讨论】:
以上是关于不那么冗长的秒表[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Apple Watch(iOS)上创建秒表(计时器)[关闭]