ZetCode

Dart StopWatch

最后修改日期:2025 年 6 月 4 日

Dart 中的 StopWatch 类用于精确测量时间,非常适合性能分析和基准测试。它提供高分辨率计时,可高效跟踪经过的时间。

作为 dart:core 库的一部分,StopWatch 无需额外导入,并提供毫秒和微秒的时间测量。在受支持的平台上,它可以提供纳秒精度,确保关键操作的高度准确计时。

StopWatch 的基本用法

使用 StopWatch 的最简单方法是启动它,执行操作,然后停止它。之后可以检索经过的时间。

main.dart
void main() {
  var stopwatch = Stopwatch();
  
  stopwatch.start();
  // Simulate work
  for (var i = 0; i < 1000000; i++) {}
  stopwatch.stop();
  
  print('Elapsed time: ${stopwatch.elapsedMilliseconds} ms');
}

此示例创建了一个 StopWatch,启动它,执行一个循环,停止它,然后打印经过的毫秒数。elapsedMilliseconds 属性返回总经过时间。

$ dart main.dart
Elapsed time: 2 ms

测量多个间隔

StopWatch 可以通过多次启动和停止来测量多个间隔。经过的时间会在所有间隔之间累积。

main.dart
void main() {
  var stopwatch = Stopwatch()..start();
  
  // First operation
  for (var i = 0; i < 500000; i++) {}
  stopwatch.stop();
  
  print('First interval: ${stopwatch.elapsedMicroseconds} μs');
  
  // Second operation
  stopwatch.start();
  for (var i = 0; i < 1000000; i++) {}
  stopwatch.stop();
  
  print('Total time: ${stopwatch.elapsedMicroseconds} μs');
}

在这里,我们测量了两个独立的操作,同时累积了总时间。重新启动时,StopWatch 会从之前的位置继续计数。

$ dart main.dart
First interval: 1000 μs
Total time: 3000 μs

重置和重用

StopWatch 可以重置为零并用于新的测量。这对于重复的基准测试很有用。

main.dart
void main() {
  var stopwatch = Stopwatch();
  
  // First measurement
  stopwatch.start();
  performOperation();
  stopwatch.stop();
  print('First run: ${stopwatch.elapsedMilliseconds} ms');
  
  // Reset and measure again
  stopwatch.reset();
  stopwatch.start();
  performOperation();
  stopwatch.stop();
  print('Second run: ${stopwatch.elapsedMilliseconds} ms');
}

void performOperation() {
  // Simulate work
  for (var i = 0; i < 1000000; i++) {}
}

reset 方法将经过的时间重置为零。这使得同一个 StopWatch 实例可以用于多个独立测量。

$ dart main.dart
First run: 2 ms
Second run: 1 ms

微秒精度

为了进行更精确的测量,StopWatch 通过 elapsedMicroseconds 属性提供微秒级计时。

main.dart
void main() {
  var stopwatch = Stopwatch()..start();
  
  // Very short operation
  var sum = 0;
  for (var i = 0; i < 100; i++) {
    sum += i;
  }
  
  stopwatch.stop();
  
  print('Operation took:');
  print('${stopwatch.elapsedMicroseconds} microseconds');
  print('${stopwatch.elapsedMilliseconds} milliseconds');
}

此示例显示了微秒和毫秒精度之间的区别。对于非常短的操作,微秒提供了更细粒度的测量。

$ dart main.dart
Operation took:
50 microseconds
0 milliseconds

测量代码块

StopWatch 可用于比较不同代码实现的性能。这有助于识别瓶颈和优化关键部分。

main.dart
void main() {
  var stopwatch = Stopwatch();
  const size = 10000;
  
  // Measure List creation
  stopwatch.start();
  var list1 = List.generate(size, (i) => i);
  stopwatch.stop();
  print('List.generate: ${stopwatch.elapsedMicroseconds} μs');
  
  stopwatch.reset();
  
  // Measure manual List creation
  stopwatch.start();
  var list2 = [];
  for (var i = 0; i < size; i++) {
    list2.add(i);
  }
  stopwatch.stop();
  print('Manual creation: ${stopwatch.elapsedMicroseconds} μs');
}

此示例比较了在 Dart 中创建列表的两种方法。StopWatch 有助于确定哪种方法对于给定大小的集合更快。

$ dart main.dart
List.generate: 1200 μs
Manual creation: 800 μs

最佳实践

来源

Dart StopWatch 文档

本教程介绍了 Dart 的 StopWatch 类,并通过实际示例展示了如何有效测量和比较代码执行时间。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 Dart 教程