【发布时间】: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 看来,我可以大大减少代码行数。我认为我最反对的是输出格式逻辑的重复。在我开发过的应用程序中,我发现很多不一致的地方(有时甚至是完全不正确的代码),所以我真的很想只做一次。静态辅助方法听起来是正确的选择。
标签: c# .net logging performance-testing stopwatch