不那么冗长的秒表[关闭]

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 调用重构为静态助手类的新方法,以及StopTrace 调用。但是,真的,这有那么令人反感吗?恕我直言,这几乎不是冗长 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";
    

【讨论】:

以上是关于不那么冗长的秒表[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何让 webpack 不那么冗长?

角度为 8 的秒表 [关闭]

如何在 Apple Watch(iOS)上创建秒表(计时器)[关闭]

在 .NET Core 中使用 CQRS 与服务类的冗长任务 [关闭]

如何在 iOS 上创建漂亮的按钮? [关闭]

DotNetNuke、Umbraco 或 Orchard [关闭]