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 index 5d16f39..769e990 100644 --- a/java/server/src/main/java/org/softwareheritage/graph/benchmark/AccessEdge.java +++ b/java/server/src/main/java/org/softwareheritage/graph/benchmark/AccessEdge.java @@ -1,49 +1,49 @@ package org.softwareheritage.graph.benchmark; import java.io.IOException; import java.util.ArrayList; import it.unimi.dsi.big.webgraph.LazyLongIterator; import org.softwareheritage.graph.Graph; import org.softwareheritage.graph.utils.Random; import org.softwareheritage.graph.utils.Statistics; import org.softwareheritage.graph.utils.Timing; /** * Benchmark to time edge access time. * * @author Thibault Allançon * @version 0.0.1 * @since 0.0.1 */ public class AccessEdge { /** * Main entrypoint. * * @param args command line arguments */ public static void main(String[] args) throws IOException { String path = args[0]; Graph graph = new Graph(path); final long seed = 42; - final long nbNodes = 1_000_000; + final int nbNodes = 1_000_000; Random random = new Random(seed); long[] nodeIds = random.generateNodeIds(graph, nbNodes); ArrayList timings = new ArrayList<>(); for (long nodeId : nodeIds) { long startTime = Timing.start(); LazyLongIterator neighbors = graph.successors(nodeId); long firstNeighbor = neighbors.nextLong(); double duration = (double) Timing.stop(startTime); timings.add(duration); } System.out.println("Used " + 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/utils/Random.java b/java/server/src/main/java/org/softwareheritage/graph/utils/Random.java index 93fdf78..7eba612 100644 --- a/java/server/src/main/java/org/softwareheritage/graph/utils/Random.java +++ b/java/server/src/main/java/org/softwareheritage/graph/utils/Random.java @@ -1,43 +1,69 @@ package org.softwareheritage.graph.utils; +import java.util.PrimitiveIterator; + import org.softwareheritage.graph.Graph; +import org.softwareheritage.graph.Node; /** * Random related utility class. * * @author Thibault Allançon * @version 0.0.1 * @since 0.0.1 */ public class Random { /** Internal pseudorandom generator */ java.util.Random random; /** * Constructor. */ public Random() { this.random = new java.util.Random(); } /** * Constructor. * * @param seed random generator seed */ public Random(long seed) { this.random = new java.util.Random(seed); } /** * Generates random node ids. * - * @param graph graph from which node ids will be picked + * @param graph graph used to pick node ids * @param nbNodes number of node ids to generate * @return an array of random node ids */ - public long[] generateNodeIds(Graph graph, long nbNodes) { + public long[] generateNodeIds(Graph graph, int nbNodes) { return random.longs(nbNodes, 0, graph.getNbNodes()).toArray(); } + + /** + * Generates random node ids with a specific type. + * + * @param graph graph used to pick node ids + * @param nbNodes number of node ids to generate + * @param expectedType specific node type to pick + * @return an array of random node ids + */ + public long[] generateNodeIdsOfType(Graph graph, int nbNodes, Node.Type expectedType) { + PrimitiveIterator.OfLong nodes = random.longs(0, graph.getNbNodes()).iterator(); + long[] nodeIds = new long[nbNodes]; + + long nextId; + for (int i = 0; i < nbNodes; i++) { + do { + nextId = nodes.nextLong(); + } while (graph.getNodeType(nextId) != expectedType); + nodeIds[i] = nextId; + } + + return nodeIds; + } }