C# 计时器
最后修改于 2025 年 5 月 16 日
本 C# 计时器教程演示了如何在 C# 中使用 Stopwatch 类来测量执行时间,以实现精确的性能跟踪。
Stopwatch 类提供了一系列方法和属性,可以实现精确的时间测量。 它是 System.Diagnostics 命名空间的一部分,使其成为性能分析的强大工具。
使用 Stopwatch 简单有效:使用 Start 启动计时器,执行要测量的代码段,然后使用 Stop 停止计时器。 然后可以使用 Elapsed、ElapsedMilliseconds 或 ElapsedTicks 等属性访问经过的时间,从而提供各种精度级别。
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# 程序的执行时间。
作者
列出所有 C# 教程。