import java.io.IOException;
import java.lang.module.ModuleDescriptor;
import java.lang.module.ModuleFinder;
import java.lang.module.ModuleReader;
import java.lang.module.ModuleReference;
import java.util.*;

public class BigLayerBenchmark {
    public static void main(String... args) {
        for (int modCount = 100; modCount <= 1000; modCount += 100) {
            Map<String, ModuleReference> modules = new HashMap<>();

            for (int i = 0; i < modCount; ++i) {
                String name = "testmodule" + i;
                var desc = ModuleDescriptor.newAutomaticModule(name).build();
                modules.put(name, new ModuleReference(desc, null) {
                    @Override
                    public ModuleReader open() throws IOException {
                        throw new UnsupportedOperationException();
                    }
                });
            }
            var references = new HashSet<>(modules.values());

            var finder = new ModuleFinder() {
                @Override
                public Optional<ModuleReference> find(String name) {
                    return Optional.ofNullable(modules.get(name));
                }

                @Override
                public Set<ModuleReference> findAll() {
                    return references;
                }
            };

            long start = System.nanoTime();
            ModuleLayer.boot().configuration().resolve(finder, ModuleFinder.ofSystem(), modules.keySet());
            long end = System.nanoTime();

            System.out.printf("Time for %4d automatic modules = %.1fs\n", modCount, (end - start) / 1e9);
        }
    }
}