package esl.cuenet.index.benchmarks; import com.infomatiq.jsi.Rectangle; import com.infomatiq.jsi.SpatialIndex; import com.infomatiq.jsi.rtree.RTree; import esl.system.SysLoggerUtils; import gnu.trove.TIntProcedure; import org.junit.Test; import java.util.Random; public class JSIBenchmark { static { SysLoggerUtils.initLogger(); } class Interval { int start; int end; } @Test public void retrieveTest() { SpatialIndex si = new RTree(); si.init(null); int lim = 10; for (int i=0; i < lim; i++) { Rectangle r = new Rectangle(1+i, 1, 22-i, 2); si.add(r, i); System.out.println("Inserting " + r + " " + i); } Rectangle query = new Rectangle((float) 7.5, 1, (float)11.5, 2); TIntProcedure proc = new TIntProcedure() { @Override public boolean execute(int i) { System.out.println(i); return true; } }; si.intersects(query, proc); } public long insertbench(int intervalCount) { // Create and initialize an rtree SpatialIndex si = new RTree(); si.init(null); int intervalStart = 0, intervalEnd = 1000000; Interval[] intervalStore = new Interval[intervalCount]; Random generator = new Random(); int span; for (int i=0; i<intervalCount; i++) { intervalStore[i] = new Interval(); intervalStore[i].start = intervalStart + generator.nextInt(intervalEnd); span = (int) (1000*generator.nextGaussian()); span = Math.abs(span); intervalStore[i].end = intervalStore[i].start + span; if (intervalStore[i].end > intervalEnd) intervalStore[i].end = intervalEnd; } long startTime = System.currentTimeMillis(); for (int i=0; i<intervalCount; i++) si.add(new Rectangle(intervalStore[i].start, 1, intervalStore[i].end, 2), i); long diff = (System.currentTimeMillis() - startTime); System.out.println("Time taken to add " + intervalCount + " intervals " + diff); return diff; } public void findbench(int intervalCount, int queries) { Random generator = new Random(); SpatialIndex si = new RTree(); si.init(null); int intervalStart = 0, intervalEnd = 10000000; Interval[] intervalStore = new Interval[intervalCount]; int span = (intervalEnd- intervalStart)/intervalCount; for (int i=0; i<intervalCount; i++) { intervalStore[i] = new Interval(); intervalStore[i].start = i * span; intervalStore[i].end = (i+1) * span; } for (int i=0; i<intervalCount; i++) si.add(new Rectangle(intervalStore[i].start, 1, intervalStore[i].end, 2), i); System.out.println("Insertion Complete (" + intervalCount + ")"); long start = System.currentTimeMillis(); int s, e; final int[] count = {0}; Rectangle query = new Rectangle(); for (int i=0; i<queries; i++) { s = generator.nextInt(intervalEnd); e = generator.nextInt(intervalEnd); if (e > s) query.set(s, 1, e, 2); else query.set(e, 1, s, 2); count[0] = 0; si.intersects(query, new TIntProcedure() { @Override public boolean execute(int i) { count[0]++; if (count[0] > 100) return false; return true; } }); //System.out.println(Math.abs(e-s) + " " + count[0] * span); } long diff = System.currentTimeMillis() - start; System.out.println("Time taken to query: " + diff); System.out.println("Average time for one query: " + (double) diff/queries); System.out.println(); } @Test public void insertbench() { insertbench(1000); insertbench(10000); insertbench(100000); insertbench(1000000); insertbench(10000000); } @Test public void findbench() { findbench(10000000, 10000); findbench(1000, 100); findbench(10000, 1000); findbench(100000, 10000); findbench(1000000, 10000); } }