BenchmarkResult.fromSamples constructor

BenchmarkResult.fromSamples({
  1. required String testName,
  2. required List<int> samples,
  3. required Duration totalDuration,
  4. required DateTime timestamp,
  5. int failures = 0,
})

由耗时样本计算统计量 / Computes the statistics from raw samples.

samples 为标准化的单次耗时(微秒)/ samples holds per-iteration durations in microseconds.

Implementation

factory BenchmarkResult.fromSamples({
  required String testName,
  required List<int> samples,
  required Duration totalDuration,
  required DateTime timestamp,
  int failures = 0,
}) {
  if (samples.isEmpty) {
    return BenchmarkResult(
      testName: testName,
      iterations: 0,
      totalDuration: totalDuration,
      averageDuration: Duration.zero,
      minDuration: Duration.zero,
      maxDuration: Duration.zero,
      standardDeviation: Duration.zero,
      operationsPerSecond: 0,
      failures: failures,
      timestamp: timestamp,
    );
  }

  final sum = samples.fold<int>(0, (previous, value) => previous + value);
  final average = sum / samples.length;
  final variance =
      samples
          .map((value) {
            final diff = value - average;
            return diff * diff;
          })
          .fold<double>(0, (previous, value) => previous + value) /
      samples.length;
  final totalSeconds =
      totalDuration.inMicroseconds / Duration.microsecondsPerSecond;
  final minSample = samples.reduce(math.min);

  return BenchmarkResult(
    testName: testName,
    iterations: samples.length,
    totalDuration: totalDuration,
    averageDuration: Duration(microseconds: average.round()),
    minDuration: Duration(microseconds: minSample),
    maxDuration: Duration(microseconds: samples.reduce(math.max)),
    standardDeviation: Duration(
      microseconds: variance.isNaN ? 0 : math.sqrt(variance).round(),
    ),
    operationsPerSecond: totalSeconds <= 0
        ? 0
        : samples.length / totalSeconds,
    failures: failures,
    timestamp: timestamp,
  );
}