diff --git a/benchmark_cherrypick/bin/main.dart b/benchmark_cherrypick/bin/main.dart index 21e91bd..586e1df 100644 --- a/benchmark_cherrypick/bin/main.dart +++ b/benchmark_cherrypick/bin/main.dart @@ -146,6 +146,52 @@ T parseEnum(String value, List values, T defaultValue) { ); } +/// --- Report Generation --- +abstract class ReportGenerator { + String render(List> results); + List get keys; +} +class PrettyReport extends ReportGenerator { + @override + final List keys = [ + 'benchmark','chainCount','nestingDepth','mean_us','median_us','stddev_us', + 'min_us','max_us','trials','memory_diff_kb','delta_peak_kb','peak_rss_kb' + ]; + @override + String render(List> rows) { + final header = keys.join('\t'); + final lines = rows.map((r) => keys.map((k) => (r[k] ?? '').toString()).join('\t')).toList(); + return ([header] + lines).join('\n'); + } +} +class CsvReport extends ReportGenerator { + @override + final List keys = [ + 'benchmark','chainCount','nestingDepth','mean_us','median_us','stddev_us', + 'min_us','max_us','trials','timings_us','memory_diff_kb','delta_peak_kb','peak_rss_kb' + ]; + @override + String render(List> rows) { + final header = keys.join(','); + final lines = rows.map((r) => + keys.map((k) { + final v = r[k]; + if (v is List) return '"${v.join(';')}"'; + return (v ?? '').toString(); + }).join(',') + ).toList(); + return ([header] + lines).join('\n'); + } +} +class JsonReport extends ReportGenerator { + @override + List get keys => []; + @override + String render(List> rows) { + return '[\n${rows.map((r) => ' $r').join(',\n')}\n]'; + } +} + Future main(List args) async { final parser = ArgParser() ..addOption('benchmark', abbr: 'b', defaultsTo: 'chainSingleton') @@ -235,42 +281,13 @@ Future main(List args) async { } } } - if (format == 'json') { - print(_toJson(results)); - } else if (format == 'csv') { - print(_toCsv(results)); - } else { - print(_toPretty(results)); - } + + final reportGenerators = { + 'pretty': PrettyReport(), + 'csv': CsvReport(), + 'json': JsonReport(), + }; + print(reportGenerators[format]?.render(results) ?? PrettyReport().render(results)); } -// --- helpers --- List _parseIntList(String s) => s.split(',').map((e) => int.tryParse(e.trim()) ?? 0).where((x) => x > 0).toList(); -String _toPretty(List> rows) { - final keys = [ - 'benchmark','chainCount','nestingDepth','mean_us','median_us','stddev_us', - 'min_us','max_us','trials','memory_diff_kb','delta_peak_kb','peak_rss_kb' - ]; - final header = keys.join('\t'); - final lines = rows.map((r) => keys.map((k) => (r[k] ?? '').toString()).join('\t')).toList(); - return ([header] + lines).join('\n'); -} -String _toCsv(List> rows) { - final keys = [ - 'benchmark','chainCount','nestingDepth','mean_us','median_us','stddev_us', - 'min_us','max_us','trials','timings_us','memory_diff_kb','delta_peak_kb','peak_rss_kb' - ]; - final header = keys.join(','); - final lines = rows.map((r) => - keys.map((k) { - final v = r[k]; - if (v is List) return '"${v.join(';')}"'; - return (v ?? '').toString(); - }).join(',') - ).toList(); - return ([header] + lines).join('\n'); -} -String _toJson(List> rows) { - return '[\n${rows.map((r) => ' $r').join(',\n')}\n]'; -} -// --- end helpers ---