使用Stopwatch类计算代码运行时间

http://msdn.microsoft.com/zh-cn/library/vstudio/System.Diagnostics.Stopwatch(v=vs.100).aspx


using System;
using System.Diagnostics;
using System.Threading;
class Program
{
    static void Main(string[] args)
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        Thread.Sleep(10000);
        stopWatch.Stop();
        // Get the elapsed time as a TimeSpan value.
        TimeSpan ts = stopWatch.Elapsed;

        // Format and display the TimeSpan value.
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 10);
        Console.WriteLine("RunTime " + elapsedTime);
    }
}


<think> 我们正在讨论如何使用C#的Stopwatch计算时间。根据用户的问题和之前的引用,我们需要详细介绍Stopwatch使用步骤。 主要步骤包括: 1. 引入命名空间:System.Diagnostics 2. 创建Stopwatch实例 3. 开始计时(Start或Restart) 4. 执行要测量的代码 5. 停止计时(Stop) 6. 获取经过的时间(Elapsed, ElapsedMilliseconds, ElapsedTicks等) 同时,根据引用内容,我们还可以提到一些优化措施,如预运行(避免JIT编译影响)、多次测量取平均、控制环境干扰等。 另外,我们可以展示如何将Stopwatch封装成一个工具方法,方便复用。 最后,按照要求生成相关问题。 注意:引用标识要自然地添加在参考内容的末尾。数学公式按照要求使用$...$或$$...$$格式(虽然本主题可能较少涉及数学公式,但如果有计算过程,则按规则处理)。 </think> ### C# 使用 Stopwatch 精确计算时间的方法 #### 📝 核心步骤(基于引用内容[^1][^3][^4]) 1. **初始化计时器** ```csharp Stopwatch stopwatch = new Stopwatch(); ``` 2. **开始计时** ```csharp stopwatch.Start(); // 标准开始方式 // 或 Stopwatch stopwatch = Stopwatch.StartNew(); // 创建并自动启动[^3] ``` 3. **执行待测代码** ```csharp // 示例:模拟耗时操作 for (int i = 0; i < 1_000_000; i++) { Math.Sqrt(i); } ``` 4. **停止计时** ```csharp stopwatch.Stop(); ``` 5. **获取时间结果** ```csharp // 方式1:获取TimeSpan对象(推荐) TimeSpan elapsed = stopwatch.Elapsed; // 方式2:毫秒值(常用) long ms = stopwatch.ElapsedMilliseconds; // 方式3:计时器刻度(高精度) long ticks = stopwatch.ElapsedTicks; ``` #### 💡 高级技巧 1. **精确时间计算** ```csharp // 转换为微秒(.NET 6+) double microseconds = (double)stopwatch.ElapsedTicks * 1_000_000 / Stopwatch.Frequency; ``` > 时间转换公式: > $$ \text{时间(单位)} = \frac{\text{ElapsedTicks} \times \text{单位系数}}{\text{Frequency}} $$ > 其中单位系数:毫秒=1000, 微秒=1,000,000, 纳秒=1,000,000,000[^3] 2. **多次测量取平均值** ```csharp int runs = 10; long totalTicks = 0; for (int i = 0; i < runs; i++) { stopwatch.Restart(); // 重置并开始 RunTestCode(); stopwatch.Stop(); totalTicks += stopwatch.ElapsedTicks; } double avgMicroseconds = (totalTicks * 1_000_000.0) / (Stopwatch.Frequency * runs); ``` #### ️ 注意事项 1. **精度验证**(引用[^3]) ```csharp Console.WriteLine($"是否高精度模式: {Stopwatch.IsHighResolution}"); Console.WriteLine($"每秒计时周期数: {Stopwatch.Frequency}"); ``` > 输出示例: > ``` > 是否高精度模式: True > 每秒计时周期数: 10000000 (表示每个刻度=100ns) > ``` 2. **避免测量干扰** - 预热代码:首次执行前先运行一次待测代码(消除JIT编译影响)[^1] - 控制GC:测量前手动触发垃圾回收 `GC.Collect()`[^1] - 关闭节能模式:防止CPU降频影响计时精度 3. **重置技巧** ```csharp stopwatch.Restart(); // 等同于 Stop() + Reset() + Start() ``` #### 📊 完整示例 ```csharp using System; using System.Diagnostics; class TimeMeasurement { static void Main() { // 预热(消除JIT影响) MeasureTime(() => { }, "预热运行"); // 实际测量 MeasureTime(() => { double sum = 0; for (int i = 0; i < 10_000_000; i++) { sum += Math.Sin(i); } }, "数学计算"); } static void MeasureTime(Action action, string testName) { var sw = Stopwatch.StartNew(); action.Invoke(); sw.Stop(); // 高精度时间计算 double microseconds = (double)sw.ElapsedTicks * 1_000_000 / Stopwatch.Frequency; Console.WriteLine($"{testName}耗时: {sw.Elapsed.TotalMilliseconds:N4} ms | " + $"{microseconds:N0} μs"); } } ``` > 输出示例: > ``` > 预热运行耗时: 0.1234 ms | 123 μs > 数学计算耗时: 245.6789 ms | 245,678 μs > ```[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值