前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【愚公系列】2023年02月 .NET/C#知识点-程序运行计时的总结

【愚公系列】2023年02月 .NET/C#知识点-程序运行计时的总结

作者头像
愚公搬代码
发布2023-03-16 16:10:18
3190
发布2023-03-16 16:10:18
举报
文章被收录于专栏:历史专栏历史专栏

文章目录


前言

在分析一个程序算法时间复杂度时,可以使用统计程序或程序片段的计算时间有助于理解程序性质,许多语言或系统都提供了内部计时功能。

下面主要是讲解C#中的计时方式:

  • Stopwatch
  • DateTime.Now
  • ValueStopwatch

一、程序运行计时的总结

1.Stopwatch

Stopwatch 一般用来测量代码运行消耗时间,以便获取更多代码运行性能上的数据。运行前先要调用 Start 函数来开始计时,结束时需要用到 Stop 函数停止计时,中间则可以插入需要监测的代码。如果有需要也还可以通过 Reset 或者 Restart 函数来重置计时器再开始下一次计时。

代码语言:javascript
复制
using System.Diagnostics;

Stopwatch sw = new Stopwatch();
sw.Start();
Thread.Sleep(999);
sw.Stop();
Console.WriteLine($"程序耗时:{sw.ElapsedMilliseconds}ms.");

Console.ReadKey();
在这里插入图片描述
在这里插入图片描述

2.DateTime.Now

DateTime是一个包含日期、时间的类型,此类型通过ToString()转换为字符串时,可根据传入给Tostring()的参数转换为多种字符串格式。

DateTime.Now主要是获取当前时间,所以也可以用于计算程序的执行时间

代码语言:javascript
复制
var start = DateTime.Now;
Thread.Sleep(999);
var stop = DateTime.Now;
Console.WriteLine($"程序耗时:{(stop - start).TotalMilliseconds}ms.");
Console.ReadKey();
在这里插入图片描述
在这里插入图片描述

3.ValueStopwatch

ValueStopwatch主要是.NET Core才出现的,ValueStopwatch 的结构体是为了减少使用 Stopwatch 带来的内存分配从而提高性能,本质还是Stopwatch。

代码语言:javascript
复制
using System.Diagnostics;

var watch = ValueStopwatch.StartNew();
Thread.Sleep(999);
Console.WriteLine($"程序耗时:{watch.GetElapsedTime().TotalMilliseconds}ms.");
Console.ReadKey();

internal struct ValueStopwatch
{
    private static readonly double TimestampToTicks = TimeSpan.TicksPerSecond / (double)Stopwatch.Frequency;

    private readonly long _startTimestamp;

    public bool IsActive => _startTimestamp != 0;

    private ValueStopwatch(long startTimestamp)
    {
        _startTimestamp = startTimestamp;
    }

    public static ValueStopwatch StartNew() => new ValueStopwatch(Stopwatch.GetTimestamp());

    public TimeSpan GetElapsedTime()
    {
        // Start timestamp can't be zero in an initialized ValueStopwatch. It would have to be literally the first thing executed when the machine boots to be 0.
        // So it being 0 is a clear indication of default(ValueStopwatch)
        if (!IsActive)
        {
            throw new InvalidOperationException("An uninitialized, or 'default', ValueStopwatch cannot be used to get elapsed time.");
        }

        var end = Stopwatch.GetTimestamp();
        var timestampDelta = end - _startTimestamp;
        var ticks = (long)(TimestampToTicks * timestampDelta);
        return new TimeSpan(ticks);
    }
}
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-02-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 前言
  • 一、程序运行计时的总结
    • 1.Stopwatch
      • 2.DateTime.Now
        • 3.ValueStopwatch
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档