1. namespace System.Diagnostics {
    2. //
    3. // 摘要:
    4. // 提供一组方法和属性,可用于准确地测量运行时间。
    5. public class Stopwatch {
    6. //
    7. // 摘要:
    8. // 获取以每秒计时周期数表示的计时器频率。此字段为只读。
    9. public static readonly long Frequency;
    10. //
    11. // 摘要:
    12. // 指示计时器是否基于高分辨率性能计数器。此字段为只读。
    13. public static readonly bool IsHighResolution;
    14. //
    15. // 摘要:
    16. // 初始化 System.Diagnostics.Stopwatch 类的新实例。
    17. public Stopwatch();
    18. //
    19. // 摘要:
    20. // 获取当前实例测量得出的总运行时间。
    21. //
    22. // 返回结果:
    23. // 一个只读的 System.TimeSpan,用于表示当前实例测量得出的总运行时间。
    24. public TimeSpan Elapsed { get; }
    25. //
    26. // 摘要:
    27. // 获取当前实例测量得出的总运行时间(以毫秒为单位)。
    28. //
    29. // 返回结果:
    30. // 一个只读长整型,表示当前实例测量得出的总毫秒数。
    31. public long ElapsedMilliseconds { get; }
    32. //
    33. // 摘要:
    34. // 获取当前实例测量得出的总运行时间(用计时器计时周期表示)。
    35. //
    36. // 返回结果:
    37. // 一个只读长整型,表示当前实例测量得出的计时器计时周期的总数。
    38. public long ElapsedTicks { get; }
    39. //
    40. // 摘要:
    41. // 获取一个指示 System.Diagnostics.Stopwatch 计时器是否在运行的值。
    42. //
    43. // 返回结果:
    44. // 如果 System.Diagnostics.Stopwatch 实例当前正在运行,并且在对某个时间间隔的运行时间进行测量,则该值为 true;否则为 false。
    45. public bool IsRunning { get; }
    46. //
    47. // 摘要:
    48. // 获取计时器机制中的当前最小时间单位数。
    49. //
    50. // 返回结果:
    51. // 一个长整型,表示基础计时器机制中的计时周期计数器值。
    52. public static long GetTimestamp();
    53. //
    54. // 摘要:
    55. // 对新的 System.Diagnostics.Stopwatch 实例进行初始化,将运行时间属性设置为零,然后开始测量运行时间。
    56. //
    57. // 返回结果:
    58. // 刚刚开始测量运行时间的 System.Diagnostics.Stopwatch。
    59. public static Stopwatch StartNew();
    60. //
    61. // 摘要:
    62. // 停止时间间隔测量,并将运行时间重置为零。
    63. public void Reset();
    64. //
    65. // 摘要:
    66. // 停止时间间隔测量,将运行时间重置为零,然后开始测量运行时间。
    67. public void Restart();
    68. //
    69. // 摘要:
    70. // 开始或继续测量某个时间间隔的运行时间。
    71. public void Start();
    72. //
    73. // 摘要:
    74. // 停止测量某个时间间隔的运行时间。
    75. public void Stop();
    76. }
    77. }

    Stopwatch的命名空间是using System.Diagnostics;
    从上文看到Restart()等于Reset()加Start()
    使用流程如下

    1. Stopwatch sw = new Stopwatch();
    2. //开始计时
    3. sw.Start();
    4. //重新设置为零
    5. sw.Reset();
    6. //重新设置并开始计时
    7. sw.Restart();
    8. //结束计时
    9. sw.Stop();
    10. //获取运行时间间隔
    11. TimeSpan ts = sw.Elapsed;
    12. //获取运行时间[毫秒]
    13. long times = sw.ElapsedMilliseconds;
    14. //获取运行的总时间
    15. long times2 = sw.ElapsedTicks;
    16. //判断计时是否正在进行[true为计时]
    17. bool isrun = sw.IsRunning;
    18. //获取计时频率
    19. long frequency = Stopwatch.Frequency;

    Stopwatch 在基础计时器机制中对计时器的计时周期进行计数,从而测量运行时间。 如果安装的硬件和操作系统支持高分辨率性能计数器,则 Stopwatch 类将使用该计数器来测量运行时间; 否则,Stopwatch 类将使用系统计数器来测量运行时间。 使用 Frequency 和 IsHighResolution 字段可以确定实现 Stopwatch 计时的精度和分辨率。


    TimeSpan 对象表示时间间隔或持续时间,按正负天数、小时数、分钟数、秒数以及秒的小数部分进行度量。用于度量持续时间的最大时间单位是天。更大的时间单位(如月和年)的天数不同,因此为保持一致性,时间间隔以天为单位来度量。
    TimeSpan 对象的值是等于所表示时间间隔的刻度数。一个刻度等于 100 纳秒,TimeSpan 对象的值的范围在 MinValue 和 MaxValue 之间。
    TimeSpan 值可以表示为 [-]d.hh:mm:ss.ff,其中减号是可选的,它指示负时间间隔,d 分量表示天,hh 表示小时(24 小时制),mm 表示分钟,ss 表示秒,而 ff 为秒的小数部分。即,时间间隔包括整的正负天数、天数和剩余的不足一天的时长,或者只包含不足一天的时长。例如,初始化为 1.0e+13 刻度的 TimeSpan 对象的文本表示“11.13:46:40”,即 11 天,13 小时,46 分钟和 40 秒。
    举个例子

    1. Stopwatch sw = new Stopwatch();
    2. //开始计时
    3. sw.Start();
    4. //5.SqlQuery()查询
    5. var sql = "select * from UserInfo where age > 15 order by age desc";
    6. object[] obj = new object[1];
    7. var info = db.UserInfo.SqlQuery(sql, obj);
    8. foreach (var item in info)
    9. {
    10. richTextBox1.Text += "姓名:" + item.Name + " 年龄:" + item.Age + "\n";
    11. }
    12. //结束计时
    13. sw.Stop();
    14. //获取运行时间[毫秒]
    15. long times = sw.ElapsedMilliseconds;
    16. richTextBox1.Text += "执行查询总共使用了" + times + "毫秒";

    第一次查询

    1. 1. 姓名:老马 年龄:55
    2. 2. 姓名:飞哥 年龄:22
    3. 3. 姓名:李四 年龄:20
    4. 4. 姓名:张三 年龄:18
    5. 5. 执行查询总共使用了500毫秒

    第二次查询

    1. 1. 姓名:老马 年龄:55
    2. 2. 姓名:飞哥 年龄:22
    3. 3. 姓名:李四 年龄:20
    4. 4. 姓名:张三 年龄:18
    5. 5. 执行查询总共使用了4毫秒

    为什么两次查询耗时差距那么大?应为EF和sql执行查询缓存的问题造成。