如何在Timefold中使用Benchmark Aggregator聚合基准测试结果并生成综合报告?
如何在Timefold中使用Benchmark Aggregator聚合基准测试结果并生成综合报告?
我来一步步帮你解决这个问题,包括如何正确调用aggregate()方法、处理所需的参数,以及适配Web应用的解决方案。
一、核心问题:获取aggregate()方法所需的参数
你困惑的两个参数本质上是用来提供待聚合的原始基准测试结果,以及给求解器结果关联友好名称的映射。下面是具体的获取和构建方式:
1. 加载所有SingleBenchmarkResult
Timefold的基准测试会在输出目录的子目录中生成单个基准测试结果文件(默认是singleBenchmarkResult.xml)。你需要遍历基准测试输出目录,读取每个子目录中的这个文件,构建List<SingleBenchmarkResult>:
import ai.timefold.benchmark.result.SingleBenchmarkResult; import ai.timefold.benchmark.result.io.XmlBenchmarkResultIO; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; // 从基准配置中获取输出目录 File benchmarkOutputDir = new File(benchmarkConfig.getBenchmarkDirectory()); XmlBenchmarkResultIO resultIO = new XmlBenchmarkResultIO(); List<SingleBenchmarkResult> singleBenchmarkResultList = new ArrayList<>(); // 遍历输出目录下的所有子目录(每个子目录对应一个SingleBenchmarkResult) File[] resultDirs = benchmarkOutputDir.listFiles(File::isDirectory); if (resultDirs != null) { for (File resultDir : resultDirs) { File resultFile = new File(resultDir, "singleBenchmarkResult.xml"); if (resultFile.exists()) { try (FileInputStream fis = new FileInputStream(resultFile)) { SingleBenchmarkResult result = resultIO.read(fis); singleBenchmarkResultList.add(result); } catch (IOException e) { // 处理读取错误,比如日志记录 e.printStackTrace(); } } } }
2. 构建solverBenchmarkResultNameMap
这个Map是为了给每个SolverBenchmarkResult关联一个可识别的名称(比如求解器的配置名),方便在报告中展示。你可以从已加载的SingleBenchmarkResult中提取相关信息来构建:
import ai.timefold.benchmark.result.SolverBenchmarkResult; import java.util.HashMap; import java.util.Map; Map<SolverBenchmarkResult, String> solverBenchmarkResultNameMap = new HashMap<>(); for (SingleBenchmarkResult result : singleBenchmarkResultList) { SolverBenchmarkResult solverResult = result.getSolverBenchmarkResult(); // 这里可以用求解器的原生名称,或者自定义业务友好的名称 solverBenchmarkResultNameMap.put(solverResult, solverResult.getName()); }
二、调用aggregate()并生成可用于Web的报告
现在你有了所需的两个参数,可以调用aggregate()方法,然后生成适合Web应用的HTML报告(替代Swing GUI):
import ai.timefold.benchmark.aggregator.AggregatedBenchmarkResult; import ai.timefold.benchmark.aggregator.BenchmarkAggregator; import ai.timefold.benchmark.report.AggregatedBenchmarkReport; import java.io.File; import java.io.IOException; // 初始化BenchmarkAggregator(复用你已有的代码) BenchmarkAggregator benchmarkAggregator = new BenchmarkAggregator(); benchmarkAggregator.setBenchmarkDirectory(benchmarkConfig.getBenchmarkDirectory()); BenchmarkReportConfig benchmarkReportConfig = benchmarkConfig.getBenchmarkReportConfig(); if (benchmarkReportConfig != null) { benchmarkReportConfig = new BenchmarkReportConfig(benchmarkReportConfig); } else { benchmarkReportConfig = new BenchmarkReportConfig(); } benchmarkAggregator.setBenchmarkReportConfig(benchmarkReportConfig); // 执行聚合操作 AggregatedBenchmarkResult aggregatedResult = benchmarkAggregator.aggregate( singleBenchmarkResultList, solverBenchmarkResultNameMap ); // 生成HTML报告(适合Web应用展示) File reportOutputDir = new File(benchmarkConfig.getBenchmarkDirectory(), "aggregated-web-report"); if (!reportOutputDir.exists()) { reportOutputDir.mkdirs(); } AggregatedBenchmarkReport.generateHtmlReport(aggregatedResult, reportOutputDir);
生成的HTML报告位于aggregated-web-report目录下,你的Web应用可以:
- 直接提供这个HTML文件的静态访问路径
- 解析
AggregatedBenchmarkResult中的数据结构,将其序列化为JSON后,用前端框架(React、Vue等)构建自定义的可视化页面(比如对比图表、统计表格)
三、关于Web应用的扩展建议
目前Timefold官方没有提供专门的Web版基准测试聚合UI,但你可以基于上述方案扩展:
- HTML报告嵌入:将生成的HTML报告嵌入到Web应用的iframe中,或者作为静态资源直接访问。
- 自定义Web可视化:
AggregatedBenchmarkResult包含了所有聚合后的核心数据(比如getSolverBenchmarkResultList()获取所有求解器结果、getProblemBenchmarkResultList()获取所有问题基准结果),你可以基于这些数据构建完全贴合业务需求的Web界面。 - 官方功能请求:如果你希望官方支持Web版聚合功能,可以在Timefold的GitHub仓库提交Feature Request,团队会评估需求优先级。
四、完整流程总结
- 从基准测试输出目录加载所有
SingleBenchmarkResult - 构建求解器结果与友好名称的映射
- 调用
aggregate()得到聚合后的基准结果 - 生成HTML报告(或解析数据用于自定义Web展示)
这样就能在不依赖Swing GUI的情况下,完成基准测试结果的聚合,并完美适配你的全栈Web应用。
内容来源于stack exchange
相关产品推荐
相关产品推荐

