使用 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);
            }
        }
    }

}