Dart学习笔记(39):Benchmark 基准测试

发表于2018-07-04 01:34 阅读(40)

通俗的讲,基准测试也就是性能测试,不同点在于前者强调定量和可对比性。可测量、可重复、可对比是基准测试的三大原则。其中,可测量是指测试过程是可以实现的,并且测试的结果可以量化表现;可重复是指按照测试过程实现的结果是相同的或处于可接受的置信区间之内,而不受测试的时间、地点和执行者的影响;可对比是指一类测试对象的测试结果具有线性关系,测试结果的大小直接决定性能的高低。

本文地址:http://www.cndartlang.com/981.html

在大型应用中应用重要算法、增加了一个新模块的时候,需要进行基准测试,以判断对整个应用的影响。基准测试的要点是易于运行,对于性能敏感的算法,基准测试验证对算法的修改确实起到改善作用,而不是性能倒退。基准测试的关键是要获得一致的、可再现的结果。

Dart语言的一个目标是快速启动。实际上,Dart的性能也可以很高效,但是必须给VM时间以优化代码。我们看到的大多测试都很短,要么执行时间太短、要么次数太少,以至于无法触发VM的优化器,这样的结果并不能反映真实的性能数据。但通常在真实应用的时候这并不是问题,它执行的时间足以被优化。

Dart团队提供了一个官方的benchmark harness库,确保你的基准测试符合Dart VM的优化器的必要过程。

harness对于pub包管理是可用的,并且使用极其简单。
1、在pubspec.yaml中设置依赖,然后运行pub get:

dependencies:
  benchmark_harness: ">=1.0.0 <2.0.0"

2、复制下面的模板,它创建一个继承自BenchmarkBase的子类:

// 引入BenchmarkBase类
import 'package:benchmark_harness/benchmark_harness.dart';

// 通过继承BenchmarkBase创建一个新的测试
class TemplateBenchmark extends BenchmarkBase {
  const TemplateBenchmark() : super("Template");

  static void main() {
    new TemplateBenchmark().report();
  }

  // 测试的代码
  void run() {
  }

  // 不计时:在测试运行之前,执行设置代码
  void setup() { }

  // 不计时:在测试运行之后,执行卸载代码
  void teardown() { }
}

main() {
  TemplateBenchmark.main();
}

基准测试将输出类似下面的内容:

Template(RunTime): 0.1568472448997197 µs.

注:µs是微秒的缩写,1秒=1000毫秒=1000000微秒=1000000000纳秒。

该库首先会预热100毫秒以上,并且运行足够的时间(默认2秒以上),以确保触发优化器。虽然源码简单,但比直接用Stopwatch更实用、准确。需要注意,输出的结果是10次测试结果的总和(而非平均值或某次结果)。

Dart VM有两种执行模式:检查模式(checked)和生产模式(production)。检查模式更慢,因为VM会检查运行时类型。在进行基准测试之前,确保你的代码在检查模式下运行没什么问题,否则生产模式下可能会出现性能问题。在确保程序没问题后,应该在生产模式运行基准测试,以获得现实世界精准的测试结果。

默认情况下,命令行执行代码的时候会关闭检查模式,你通过–checked标志打开检查模式。WebStorm默认是打开的,但是可以通过Preferences > Languages & Frameworks > Dart关闭检查模式,并且切换在检查模式的时候运行Dartium。