createReport static method

String createReport(
  1. List<int> measurements,
  2. String thread,
  3. int originalCount,
  4. int improvedCount,
  5. int originalRuntime,
  6. int improvedRuntime,
  7. int originalSkipped,
  8. int improvedSkipped,
)

Implementation

static String createReport(
    List<int> measurements,
    String thread,
    int originalCount,
    int improvedCount,
    int originalRuntime,
    int improvedRuntime,
    int originalSkipped,
    int improvedSkipped) {
  final buf = StringBuffer();

  buf.writeln('$thread thread:');

  final runtimeDifference = improvedRuntime - originalRuntime;
  final gerund = runtimeDifference <= 0 ? 'improvement' : 'worsening';
  buf.writeln('* '
      '${(runtimeDifference.abs() / originalRuntime * 100).toStringAsFixed(1)}% '
      '(${(runtimeDifference / 1000).toStringAsFixed(0)}ms) '
      '$gerund of total execution time');

  final jankRiskRatio = RiskRatio.fromPrevalence(
      improvedCount, improvedSkipped, originalCount, originalSkipped);
  if (!jankRiskRatio.isSignificant) {
    buf.write('* No significant change in jank risk');
  } else if (jankRiskRatio.ratio < 1) {
    final smallerPercent = ((1 - jankRiskRatio.upper) * 100).round();
    final higherPercent = ((1 - jankRiskRatio.lower) * 100).round();
    buf.write('* -$smallerPercent% to -$higherPercent% less potential jank');
  } else {
    final smallerPercent = ((jankRiskRatio.lower - 1) * 100).round();
    final higherPercent = ((jankRiskRatio.upper - 1) * 100).round();
    buf.write('* +$smallerPercent to +$higherPercent% more potential jank');
  }
  buf.writeln(' ($originalSkipped -> $improvedSkipped)');

  final skippedDifference = improvedSkipped - originalSkipped;
  final skippedPpt = (improvedSkipped / measurements.length -
          originalSkipped / measurements.length) *
      100;
  final noun = skippedDifference <= 0 ? 'decrease' : 'increase';
  buf.writeln('  ('
      "That's a ${skippedPpt.abs().toStringAsFixed(0)} ppt "
      '$noun in ratio of jank-to-normal frames.)');

  // final betterMeasurements = measurements.where((m) => m < 0).length;
  // final betterPercent = (betterMeasurements / measurements.length) * 100;
  // buf.writeln('* ${betterPercent.toStringAsFixed(2)}% of times are improved');

  // 833 microseconds is 5% of a 60fps frame budget
  // 1000 microseconds is 6% of a 60fps frame budget
  const threshold = 1000;
  final betterMeasurementsWithPadding =
      measurements.where((m) => m < -threshold).length;
  final betterPercentWithPadding =
      (betterMeasurementsWithPadding / measurements.length) * 100;
  buf.writeln('* ${betterPercentWithPadding.toStringAsFixed(1)}% '
      'of individual measurements improved by 1ms+');

  final worseMeasurementsWithPadding =
      measurements.where((m) => m > threshold).length;
  final worsePercentWithPadding =
      (worseMeasurementsWithPadding / measurements.length) * 100;
  buf.writeln('* ${worsePercentWithPadding.toStringAsFixed(1)}% '
      'of individual measurements worsened by 1ms+');

  return buf.toString();
}