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
最佳实践
- 预热: 在测量之前运行代码一次,以考虑 JIT 编译。
- 多次运行: 测量几次并取平均值以获得稳定的结果。
- 微秒: 对短操作使用 elapsedMicroseconds。
- 重置: 重用 StopWatch 时,始终在测量之间重置。
- 实际应用: 在与生产环境相似的条件下进行测量。
来源
本教程介绍了 Dart 的 StopWatch 类,并通过实际示例展示了如何有效测量和比较代码执行时间。
作者
列出 所有 Dart 教程。