使用 Quarkus 进行 Optaplanner 基准测试
Optaplanner benchmarking with Quarkus
我想使用 Quarkus Optaplanner 应用程序进行高级基准测试。实施的最佳方式是什么 运行?
在查看 Optaplanner 的“旧”示例时,它们都实现了基准测试(在此 video 中,有一个关于 Optaplanner 与 Quarkus 的演示,但基准测试显示的是旧示例)。我用 Quarkus 构建了我的优化求解器,我想知道如何在这里实施基准测试。我的输入数据写在 JSON 文件中,我想尝试不同的求解器配置。
这是缺少的功能,我们正在努力解决它,因此您可能只需将 benchmarkConfig.xml 文件放入 src/test/resources,无需任何 entityClass 等信息 - 甚至无需配置 xml 文件 - 并且正常工作。
我相信它会在 8.5 或 8.6 中落地。
解决方法
与此同时,这有效:
// This needs to be in src/main/java, because src/test/java doesn't work
// TODO move this to src/test/java after https://issues.redhat.com/browse/PLANNER-2341
@QuarkusMain(name = "benchmark")
public class VaccinationScheduleBenchmark implements QuarkusApplication {
public static void main(String[] args) {
Quarkus.run(VaccinationScheduleBenchmark.class, args);
}
@Inject
ObjectMapper objectMapper;
@Override
public int run(String... args) {
generateDemoFile(5, 25, 0.0);
generateDemoFile(10, 50, 0.0);
generateDemoFile(10, 50, 0.3);
generateDemoFile(25, 500, 0.0);
generateDemoFile(50, 2000, 0.0);
generateDemoFile(50, 2000, 0.3);
// The solverBenchmarkConfig.xml explicitly mentions the entityClass, etc :(
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromXmlResource("solverBenchmarkConfig.xml");
benchmarkFactory.buildPlannerBenchmark()
.benchmarkAndShowReportInBrowser();
return 0;
}
private void generateDemoFile(int vaccinationCenterCount, int totalBoothCount, double pinnedAppointmentRatio) {
File file = new File("local/input/" + vaccinationCenterCount + "vc-" + totalBoothCount + "booths"
+ (pinnedAppointmentRatio > 0.0 ? "-" + pinnedAppointmentRatio + "pinned" : "") + ".json");
if (!file.exists()) {
DemoDataGenerator demoDataGenerator = new DemoDataGenerator(33.40, 34.10, -84.90, -83.90);
VaccinationSchedule schedule = demoDataGenerator.generate(vaccinationCenterCount, totalBoothCount, pinnedAppointmentRatio);
try {
objectMapper.writeValue(file, schedule);
} catch (IOException e) {
throw new IllegalArgumentException("Failed writing file (" + file + ").", e);
}
}
}
}
我想使用 Quarkus Optaplanner 应用程序进行高级基准测试。实施的最佳方式是什么 运行?
在查看 Optaplanner 的“旧”示例时,它们都实现了基准测试(在此 video 中,有一个关于 Optaplanner 与 Quarkus 的演示,但基准测试显示的是旧示例)。我用 Quarkus 构建了我的优化求解器,我想知道如何在这里实施基准测试。我的输入数据写在 JSON 文件中,我想尝试不同的求解器配置。
这是缺少的功能,我们正在努力解决它,因此您可能只需将 benchmarkConfig.xml 文件放入 src/test/resources,无需任何 entityClass 等信息 - 甚至无需配置 xml 文件 - 并且正常工作。
我相信它会在 8.5 或 8.6 中落地。
解决方法
与此同时,这有效:
// This needs to be in src/main/java, because src/test/java doesn't work
// TODO move this to src/test/java after https://issues.redhat.com/browse/PLANNER-2341
@QuarkusMain(name = "benchmark")
public class VaccinationScheduleBenchmark implements QuarkusApplication {
public static void main(String[] args) {
Quarkus.run(VaccinationScheduleBenchmark.class, args);
}
@Inject
ObjectMapper objectMapper;
@Override
public int run(String... args) {
generateDemoFile(5, 25, 0.0);
generateDemoFile(10, 50, 0.0);
generateDemoFile(10, 50, 0.3);
generateDemoFile(25, 500, 0.0);
generateDemoFile(50, 2000, 0.0);
generateDemoFile(50, 2000, 0.3);
// The solverBenchmarkConfig.xml explicitly mentions the entityClass, etc :(
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromXmlResource("solverBenchmarkConfig.xml");
benchmarkFactory.buildPlannerBenchmark()
.benchmarkAndShowReportInBrowser();
return 0;
}
private void generateDemoFile(int vaccinationCenterCount, int totalBoothCount, double pinnedAppointmentRatio) {
File file = new File("local/input/" + vaccinationCenterCount + "vc-" + totalBoothCount + "booths"
+ (pinnedAppointmentRatio > 0.0 ? "-" + pinnedAppointmentRatio + "pinned" : "") + ".json");
if (!file.exists()) {
DemoDataGenerator demoDataGenerator = new DemoDataGenerator(33.40, 34.10, -84.90, -83.90);
VaccinationSchedule schedule = demoDataGenerator.generate(vaccinationCenterCount, totalBoothCount, pinnedAppointmentRatio);
try {
objectMapper.writeValue(file, schedule);
} catch (IOException e) {
throw new IllegalArgumentException("Failed writing file (" + file + ").", e);
}
}
}
}