diff --git a/java/server/src/main/java/org/softwareheritage/graph/benchmark/AccessEdge.java b/java/server/src/main/java/org/softwareheritage/graph/benchmark/AccessEdge.java --- a/java/server/src/main/java/org/softwareheritage/graph/benchmark/AccessEdge.java +++ b/java/server/src/main/java/org/softwareheritage/graph/benchmark/AccessEdge.java @@ -3,9 +3,11 @@ import java.io.IOException; import java.util.ArrayList; +import com.martiansoftware.jsap.JSAPException; import it.unimi.dsi.big.webgraph.LazyLongIterator; import org.softwareheritage.graph.Graph; +import org.softwareheritage.graph.benchmark.Common; import org.softwareheritage.graph.benchmark.utils.Random; import org.softwareheritage.graph.benchmark.utils.Statistics; import org.softwareheritage.graph.benchmark.utils.Timing; @@ -24,14 +26,13 @@ * * @param args command line arguments */ - public static void main(String[] args) throws IOException { - String path = args[0]; - Graph graph = new Graph(path); + public static void main(String[] args) throws IOException, JSAPException { + Common.BenchArgs benchArgs = Common.parseCommandLineArgs(args); - final long seed = 42; - final int nbNodes = 1_000_000; - Random random = new Random(seed); - long[] nodeIds = random.generateNodeIds(graph, nbNodes); + Graph graph = new Graph(benchArgs.graphPath); + Random random = (benchArgs.seed == null) ? new Random() : new Random(benchArgs.seed); + + long[] nodeIds = random.generateNodeIds(graph, benchArgs.nbNodes); ArrayList timings = new ArrayList<>(); for (long nodeId : nodeIds) { @@ -42,7 +43,7 @@ timings.add(duration); } - System.out.println("Used " + nbNodes + " random edges (results are in seconds):"); + System.out.println("Used " + benchArgs.nbNodes + " random edges (results are in seconds):"); Statistics stats = new Statistics(timings); stats.printAll(); } diff --git a/java/server/src/main/java/org/softwareheritage/graph/benchmark/Browsing.java b/java/server/src/main/java/org/softwareheritage/graph/benchmark/Browsing.java --- a/java/server/src/main/java/org/softwareheritage/graph/benchmark/Browsing.java +++ b/java/server/src/main/java/org/softwareheritage/graph/benchmark/Browsing.java @@ -2,6 +2,8 @@ import java.io.IOException; +import com.martiansoftware.jsap.JSAPException; + import org.softwareheritage.graph.Endpoint; import org.softwareheritage.graph.Graph; import org.softwareheritage.graph.Node; @@ -24,20 +26,19 @@ * * @param args command line arguments */ - public static void main(String[] args) throws IOException { - String path = args[0]; - Graph graph = new Graph(path); + public static void main(String[] args) throws IOException, JSAPException { + Common.BenchArgs benchArgs = Common.parseCommandLineArgs(args); + + Graph graph = new Graph(benchArgs.graphPath); + Random random = (benchArgs.seed == null) ? new Random() : new Random(benchArgs.seed); - final long seed = 42; - final int nbNodes = 100_000; - Random random = new Random(seed); - long[] dirNodeIds = random.generateNodeIdsOfType(graph, nbNodes, Node.Type.DIR); - long[] revNodeIds = random.generateNodeIdsOfType(graph, nbNodes, Node.Type.REV); + long[] dirNodeIds = random.generateNodeIdsOfType(graph, benchArgs.nbNodes, Node.Type.DIR); + long[] revNodeIds = random.generateNodeIdsOfType(graph, benchArgs.nbNodes, Node.Type.REV); Endpoint dirEndpoint = new Endpoint(graph, "forward", "dir:cnt,dir:dir"); Endpoint revEndpoint = new Endpoint(graph, "forward", "rev:rev"); - System.out.println("Used " + nbNodes + " random nodes (results are in seconds):"); + System.out.println("Used " + benchArgs.nbNodes + " random nodes (results are in seconds):"); System.out.println("\n'ls' use-case"); Common.timeEndpoint(graph, dirNodeIds, dirEndpoint::neighbors); System.out.println("\n'ls -R' use-case"); diff --git a/java/server/src/main/java/org/softwareheritage/graph/benchmark/Common.java b/java/server/src/main/java/org/softwareheritage/graph/benchmark/Common.java --- a/java/server/src/main/java/org/softwareheritage/graph/benchmark/Common.java +++ b/java/server/src/main/java/org/softwareheritage/graph/benchmark/Common.java @@ -3,6 +3,14 @@ import java.util.ArrayList; import java.util.function.Function; +import com.martiansoftware.jsap.FlaggedOption; +import com.martiansoftware.jsap.JSAP; +import com.martiansoftware.jsap.JSAPException; +import com.martiansoftware.jsap.JSAPResult; +import com.martiansoftware.jsap.Parameter; +import com.martiansoftware.jsap.SimpleJSAP; +import com.martiansoftware.jsap.UnflaggedOption; + import org.softwareheritage.graph.Endpoint; import org.softwareheritage.graph.Graph; import org.softwareheritage.graph.SwhPID; @@ -17,6 +25,49 @@ */ public class Common { + /** + * Benchmark input arguments. + */ + public static class BenchArgs { + /** Basename of the compressed graph */ + public String graphPath; + /** Number of random nodes to use for the benchmark */ + public int nbNodes; + /** Random generator seed */ + public Long seed; + } + + /** + * Parses benchmark command line arguments. + * + * @param args command line arguments + * @return parsed arguments as a {@link BenchArgs} + */ + public static BenchArgs parseCommandLineArgs(String[] args) throws JSAPException { + SimpleJSAP jsap = new SimpleJSAP(Common.class.getName(), + "Benchmark tool for Software Heritage use-cases scenarios.", + new Parameter[] { + new UnflaggedOption("graphPath", JSAP.STRING_PARSER, JSAP.NO_DEFAULT, JSAP.REQUIRED, + JSAP.NOT_GREEDY, "The basename of the compressed graph."), + new FlaggedOption("nbNodes", JSAP.INTEGER_PARSER, JSAP.NO_DEFAULT, JSAP.REQUIRED, 'n', + "nb-nodes", "Number of random nodes used to do the benchmark."), + new FlaggedOption("seed", JSAP.LONG_PARSER, JSAP.NO_DEFAULT, JSAP.NOT_REQUIRED, 's', + "seed", "Random generator seed."), + }); + + JSAPResult config = jsap.parse(args); + if (jsap.messagePrinted()) { + System.exit(1); + } + + BenchArgs benchArgs = new BenchArgs(); + benchArgs.graphPath = config.getString("graphPath"); + benchArgs.nbNodes = config.getInt("nbNodes"); + benchArgs.seed = config.getLong("seed"); + + return benchArgs; + } + /** * Times a specific endpoint and prints aggregated statistics. * diff --git a/java/server/src/main/java/org/softwareheritage/graph/benchmark/Provenance.java b/java/server/src/main/java/org/softwareheritage/graph/benchmark/Provenance.java --- a/java/server/src/main/java/org/softwareheritage/graph/benchmark/Provenance.java +++ b/java/server/src/main/java/org/softwareheritage/graph/benchmark/Provenance.java @@ -2,6 +2,8 @@ import java.io.IOException; +import com.martiansoftware.jsap.JSAPException; + import org.softwareheritage.graph.Endpoint; import org.softwareheritage.graph.Graph; import org.softwareheritage.graph.benchmark.Common; @@ -23,19 +25,18 @@ * * @param args command line arguments */ - public static void main(String[] args) throws IOException { - String path = args[0]; - Graph graph = new Graph(path); + public static void main(String[] args) throws IOException, JSAPException { + Common.BenchArgs benchArgs = Common.parseCommandLineArgs(args); + + Graph graph = new Graph(benchArgs.graphPath); + Random random = (benchArgs.seed == null) ? new Random() : new Random(benchArgs.seed); - final long seed = 42; - final int nbNodes = 100_000; - Random random = new Random(seed); - long[] nodeIds = random.generateNodeIds(graph, nbNodes); + long[] nodeIds = random.generateNodeIds(graph, benchArgs.nbNodes); Endpoint commitProvenanceEndpoint = new Endpoint(graph, "backward", "dir:dir,cnt:dir,dir:rev"); Endpoint originProvenanceEndpoint = new Endpoint(graph, "backward", "*"); - System.out.println("Used " + nbNodes + " random nodes (results are in seconds):"); + System.out.println("Used " + benchArgs.nbNodes + " random nodes (results are in seconds):"); System.out.println("\n'commit provenance' use-case (using dfs)"); Common.timeEndpoint(graph, nodeIds, commitProvenanceEndpoint::walk, "rev", "dfs"); diff --git a/java/server/src/main/java/org/softwareheritage/graph/benchmark/Vault.java b/java/server/src/main/java/org/softwareheritage/graph/benchmark/Vault.java --- a/java/server/src/main/java/org/softwareheritage/graph/benchmark/Vault.java +++ b/java/server/src/main/java/org/softwareheritage/graph/benchmark/Vault.java @@ -2,6 +2,8 @@ import java.io.IOException; +import com.martiansoftware.jsap.JSAPException; + import org.softwareheritage.graph.Endpoint; import org.softwareheritage.graph.Graph; import org.softwareheritage.graph.benchmark.Common; @@ -23,18 +25,17 @@ * * @param args command line arguments */ - public static void main(String[] args) throws IOException { - String path = args[0]; - Graph graph = new Graph(path); + public static void main(String[] args) throws IOException, JSAPException { + Common.BenchArgs benchArgs = Common.parseCommandLineArgs(args); + + Graph graph = new Graph(benchArgs.graphPath); + Random random = (benchArgs.seed == null) ? new Random() : new Random(benchArgs.seed); - final long seed = 42; - final int nbNodes = 100_000; - Random random = new Random(seed); - long[] nodeIds = random.generateNodeIds(graph, nbNodes); + long[] nodeIds = random.generateNodeIds(graph, benchArgs.nbNodes); Endpoint endpoint = new Endpoint(graph, "forward", "*"); - System.out.println("Used " + nbNodes + " random nodes (results are in seconds):"); + System.out.println("Used " + benchArgs.nbNodes + " random nodes (results are in seconds):"); System.out.println("\n'git bundle' use-case"); Common.timeEndpoint(graph, nodeIds, endpoint::visitNodes); }