ZetCode

C# 计时器

最后修改于 2025 年 5 月 16 日

本 C# 计时器教程演示了如何在 C# 中使用 Stopwatch 类来测量执行时间,以实现精确的性能跟踪。

Stopwatch 类提供了一系列方法和属性,可以实现精确的时间测量。 它是 System.Diagnostics 命名空间的一部分,使其成为性能分析的强大工具。

使用 Stopwatch 简单有效:使用 Start 启动计时器,执行要测量的代码段,然后使用 Stop 停止计时器。 然后可以使用 ElapsedElapsedMillisecondsElapsedTicks 等属性访问经过的时间,从而提供各种精度级别。

C# 计时器 - 字符串连接

我们测量字符串连接方法。

Program.cs
using System.Diagnostics;

var text = string.Empty;

var sw = new Stopwatch();
sw.Start();

for (int i=0; i < 100_000; i++)
{
    text += "abc";
}

var n = text.Length;
Console.WriteLine($"# of chars: {n}");

sw.Stop();
var elapsed = sw.ElapsedMilliseconds;

Console.WriteLine($"Concat elapsed: {elapsed} ms");

我们将字符串连接 100,000 次。 我们测量 + 运算符的效率;经过的时间以毫秒为单位。

$ dotnet run
of chars: 300000
Concat elapsed: 6611 ms

在第二个例子中,我们使用字符串插值。

Program.cs
using System.Diagnostics;
using System.Text;

var text = string.Empty;

var sw = new Stopwatch();
sw.Start();

for (int i=0; i < 100_000; i++)
{
    text = $"{text}abc";
}

var n = text.Length;
Console.WriteLine($"# of chars: {n}");

sw.Stop();
var elapsed = sw.ElapsedMilliseconds;

Console.WriteLine($"Interpolate elapsed: {elapsed} ms");

$ 特殊字符将字符串字面量标识为内插字符串。

$ dotnet run
of chars: 300000
Interpolate elapsed: 6576 ms

C# 计时器 - 排序算法

有几种算法可以对项目进行排序。 我们将比较选择排序和冒泡排序。

Program.cs
using System.Diagnostics;

var sw = new Stopwatch();
sw.Start();

DoSelectionSort(GetArray());

sw.Stop();

var elapsed = sw.ElapsedMilliseconds;

Console.WriteLine($"Selection sort: {elapsed} ms");

int[] GetArray()
{
    var rnd = new Random();

    var vals = new int[30_000];
    for (int i = 0; i < 30_000; i++)
    {

        vals[i] = rnd.Next(1, 100);
    }

    return vals;
}

void DoSelectionSort(int[] a)
{
    int len = a.Length;

    for (int i = 0; i < len - 1; i++)
    {

        int min_idx = i;

        for (int j = i + 1; j < len; j++)
        {
            if (a[j] < a[min_idx])
            {
                min_idx = j;
            }
        }

        int temp = a[min_idx];
        a[min_idx] = a[i];
        a[i] = temp;
    }
}

我们创建一个包含 30,000 个随机值的数组。 这些元素使用选择排序进行排序。

$ dotnet run
Selection sort: 1871 ms

在第二个例子中,我们测量冒泡排序。

Program.cs
using System.Diagnostics;

var sw = new Stopwatch();
sw.Start();

DoBubbleSort(GetArray());

sw.Stop();

var elapsed = sw.ElapsedMilliseconds;

Console.WriteLine($"Bubble sort: {elapsed} ms");

int[] GetArray()
{
    var rnd = new Random();

    var vals = new int[30_000];
    for (int i = 0; i < 30_000; i++)
    {

        vals[i] = rnd.Next(1, 100);
    }

    return vals;
}

void DoBubbleSort(int[] a)
{
    int len = a.Length;

    for (int i = 0; i < len - 1; i++)
    {
        for (int j = 0; j < len - i - 1; j++)
        {
            if (a[j] > a[j + 1])
            {
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }
}

冒泡排序是一种效率较低的算法,因此使用冒泡排序对数组进行排序应该需要更长的时间。

$ dotnet run
Bubble sort: 4368 ms

C# 计时器 - 测量 LINQ 查询性能

计时器还可用于测量大型集合上 LINQ 查询的执行时间。

Program.cs
using System.Diagnostics;

var numbers = Enumerable.Range(1, 10_000_000).ToArray();

var sw = new Stopwatch();
sw.Start();

var result = numbers.Where(n => n % 2 == 0).Select(n => n * n).ToArray();

sw.Stop();
var elapsed = sw.ElapsedMilliseconds;

Console.WriteLine($"Processed {result.Length} numbers in {elapsed} ms");

此示例测量使用 LINQ 过滤和转换 1000 万个数字所需的时间。

来源

计时器类 - 语言参考

在本文中,我们使用 Stopwatch 测量了 C# 程序的执行时间。

作者

我叫 Jan Bodnar,是一位热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程