Skip to content

Commit

Permalink
add warmup step
Browse files Browse the repository at this point in the history
  • Loading branch information
msbarry committed Dec 7, 2023
1 parent 39a3b25 commit 0001c16
Showing 1 changed file with 40 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,31 +12,34 @@
package test.jts.perf.index;

import org.locationtech.jts.geom.Envelope;
import org.locationtech.jts.index.SpatialIndex;
import org.locationtech.jts.index.hprtree.HPRtree;
import org.locationtech.jts.index.strtree.STRtree;
import org.locationtech.jts.util.Stopwatch;
import test.jts.perf.PerformanceTestCase;
import test.jts.perf.PerformanceTestRunner;

import java.util.Random;
import java.util.function.Consumer;
import java.util.function.Supplier;

/**
* Reproduce the performance benchmark scenario that
* <a href="https://github.com/mourner/flatbush/blob/main/bench.js">Flatbush</a>
* uses, and run against spatial indexes.
*/
public class FlatbushPerfTest extends PerformanceTestCase {
private static final int ITEMS = 1_000_000;
private static final int QUERIES = 1_000;
private static final int NUM_ITEMS = 1_000_000;
private static final int NUM_QUERIES = 1_000;
private Envelope[] items;
private Envelope[] queries;
private HPRtree hprtree;
private STRtree strtree;

public static void main(String[] args) {
PerformanceTestRunner.run(FlatbushPerfTest.class);
}

private HPRtree hprtree;
private STRtree strtree;
private Envelope[] boxes;

public FlatbushPerfTest(String name) {
super(name);
setRunSize(new int[] { 1, 10, (int) (100 * Math.sqrt(0.1))});
Expand All @@ -54,50 +57,63 @@ private static Envelope randomBox(Random random, double boxSize) {
public void setUp()
{
Random random = new Random(0);
Envelope[] envs = new Envelope[ITEMS];
items = new Envelope[NUM_ITEMS];

for (int i = 0; i < ITEMS; i++) {
envs[i] = randomBox(random, 1);
for (int i = 0; i < NUM_ITEMS; i++) {
items[i] = randomBox(random, 1);
}

hprtree = new HPRtree();
// warmup the jvm by building once and running queries
warmupQueries(createIndex(HPRtree::new, HPRtree::build));
warmupQueries(createIndex(STRtree::new, STRtree::build));

Stopwatch sw = new Stopwatch();
for (Envelope env : envs) {
hprtree.insert(env, env);
}
hprtree.build();
hprtree = createIndex(HPRtree::new, HPRtree::build);
System.out.println("HPRTree Build time = " + sw.getTimeString());

strtree = new STRtree();
sw = new Stopwatch();
for (Envelope env : envs) {
strtree.insert(env, env);
}
strtree.build();
strtree = createIndex(STRtree::new, STRtree::build);
System.out.println("STRTree Build time = " + sw.getTimeString());
}

private <T extends SpatialIndex> T createIndex(Supplier<T> supplier, Consumer<T> builder) {
T index = supplier.get();
for (Envelope env : items) {
index.insert(env, env);
}
builder.accept(index);
return index;
}

private void warmupQueries(SpatialIndex index) {
Random random = new Random(0);
CountItemVisitor visitor = new CountItemVisitor();
for (int i = 0; i < NUM_QUERIES; i++) {
index.query(randomBox(random, 1), visitor);
}
}

public void startRun(int size)
{
System.out.println("----- Query size: " + size);
Random random = new Random(0);
boxes = new Envelope[QUERIES];
for (int i = 0; i < QUERIES; i++) {
boxes[i] = randomBox(random, size);
queries = new Envelope[NUM_QUERIES];
for (int i = 0; i < NUM_QUERIES; i++) {
queries[i] = randomBox(random, size);
}
}

public void runQueriesHPR() {
CountItemVisitor visitor = new CountItemVisitor();
for (Envelope box : boxes) {
for (Envelope box : queries) {
hprtree.query(box, visitor);
}
System.out.println("HPRTree query result items = " + visitor.count);
}

public void runQueriesSTR() {
CountItemVisitor visitor = new CountItemVisitor();
for (Envelope box : boxes) {
for (Envelope box : queries) {
strtree.query(box, visitor);
}
System.out.println("STRTree query result items = " + visitor.count);
Expand Down

0 comments on commit 0001c16

Please sign in to comment.