package benchmark; import static org.javersion.core.Version.DEFAULT_BRANCH; import static org.javersion.path.PropertyPath.ROOT; import java.util.Map; import java.util.UUID; import java.util.concurrent.TimeUnit; import org.javersion.core.Merge; import org.javersion.object.ObjectVersion; import org.javersion.object.ObjectVersionGraph; import org.javersion.path.PropertyPath; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.RunnerException; import org.openjdk.jmh.runner.options.Options; import org.openjdk.jmh.runner.options.OptionsBuilder; import com.google.common.collect.ImmutableMap; @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MILLISECONDS) @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) @Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) @Fork(1) @State(Scope.Benchmark) public class MergeBenchmark { @Param({"1", "10", "20", "50", "100", "500"}) public int versions; @Param({"100", "1000", "2000", "3000", "5000"}) public int properties; private ObjectVersionGraph<Void> versionGraph; private Map<PropertyPath, Object> change; @Setup public void setup() { ImmutableMap.Builder<PropertyPath, Object> builder = ImmutableMap.builder(); PropertyPath path = ROOT.property("list"); for (int i=0; i < properties; i++) { builder.put(path.index(i), UUID.randomUUID().toString()); } ObjectVersion<Void> version = ObjectVersion.<Void>builder().changeset(builder.build()).build(); versionGraph = ObjectVersionGraph.init(version); builder.put(path.index(properties), UUID.randomUUID().toString()); change = builder.build(); } @Benchmark public Merge<PropertyPath, Object, Void> concurrentVersions() { ObjectVersion.Builder<Void> changeBuilder = ObjectVersion.<Void>builder() .parents(versionGraph.getTip().revision) .changeset(change); for (int i = 0; i < versions; i++) { versionGraph = versionGraph.commit(changeBuilder.build()); } return versionGraph.mergeBranches(DEFAULT_BRANCH); } @Benchmark public Merge<PropertyPath, Object, Void> sequentialVersions() { ObjectVersion.Builder<Void> changeBuilder = ObjectVersion.<Void>builder() .changeset(change); for (int i = 0; i < versions; i++) { changeBuilder.parents(versionGraph.getTip().revision); versionGraph = versionGraph.commit(changeBuilder.build()); } return versionGraph.mergeBranches(DEFAULT_BRANCH); } public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder() .include(MergeBenchmark.class.getSimpleName()) .build(); new Runner(opt).run(); } }