package com.github.hoffart.dmap.benchmark;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Random;
import com.github.hoffart.dmap.DMap;
import com.github.hoffart.dmap.DMapBuilder;
public class DMapBenchmark {
static int[] arrBlockSizes = new int[] {1024, 1048576}; // 1 KB, 1 MB
static int[] arrKeys = new int[] {1<<10, 1<<15}; // number of keys to be used for benchmarking
static long[][] keyAddResults;
static long[][] mapReadResults;
static long[][] rndReadResults;
static long[][] iterReadResults;
static int[][] blocksUsed;
public static void main(String[] args) throws IOException {
boolean[] arrPreloadOffsets = new boolean[]{true, false};
boolean[] arrCompressValues = new boolean[]{false, true};
for(boolean preloadOffset : arrPreloadOffsets) {
for (boolean arrCompressValue : arrCompressValues) {
init();
for (int i = 0; i < arrBlockSizes.length; i++) {
for (int j = 0; j < arrKeys.length; j++) {
runDmapBenchmarkTest(i, j, preloadOffset, arrCompressValue);
}
}
printResults(preloadOffset, arrCompressValue);
}
}
}
private static void init() {
int n = arrBlockSizes.length;
int m = arrKeys.length;
rndReadResults = new long[n][m];
iterReadResults = new long[n][m];
keyAddResults = new long[n][m];
mapReadResults = new long[n][m];
blocksUsed = new int[n][m];
}
private static void printResults(boolean preloadOffset, boolean compressValues) {
System.out.println("================");
System.out.print("OFFSET PRELOADING : ");
if(preloadOffset) {
System.out.println("ENABLED");
} else {
System.out.println("DISABLED");
}
System.out.print("VALUE COMPRESSION : ");
if(compressValues) {
System.out.println("ENABLED");
} else {
System.out.println("DISABLED");
}
for(int i=0;i<arrBlockSizes.length;i++) {
System.out.println("BLOCK SIZE : " + arrBlockSizes[i]);
for(int j=0;j<arrKeys.length;j++) {
System.out.println("# OF KEYS : " + arrKeys[j]);
System.out.println("Time to add " + arrKeys[j] + " (int,int) pairs : "
+ keyAddResults[i][j] + "ms.");
System.out.println("Time to read map : " + mapReadResults[i][j] + "ms.");
System.out.println("Blocks used by map : " + blocksUsed[i][j]);
System.out.println("Time for random read of " + arrKeys[j] + " keys : " +
rndReadResults[i][j] + "ms.");
System.out.println("Time for iterator read of " + arrKeys[j] + " keys : " +
iterReadResults[i][j] + "ms.");
System.out.println();
}
}
System.out.println("================");
}
private static void runDmapBenchmarkTest(int bIdx, int kIdx, boolean preloadOffset, boolean compressValues) throws IOException {
int blockSize = arrBlockSizes[bIdx];
int keys = arrKeys[kIdx];
File mapFile = File.createTempFile("tmp", "dmap");
mapFile.delete();
DMapBuilder dmapBuilder = new DMapBuilder(mapFile, blockSize, compressValues);
ByteBuffer buf = ByteBuffer.allocate(4);
long time1 = System.currentTimeMillis();
for (int i = 0; i < keys; ++i) {
byte[] bytes = buf.putInt(i).array();
buf.rewind();
dmapBuilder.add(bytes, bytes);
}
dmapBuilder.build();
long time2 = System.currentTimeMillis();
long runTime = time2 - time1;
keyAddResults[bIdx][kIdx] = runTime;
long time3 = System.currentTimeMillis();
DMap.Builder loader = new DMap.Builder(mapFile);
if(preloadOffset) {
loader = loader.preloadOffsets();
}
DMap dmap = loader.build();
long time4 = System.currentTimeMillis();
runTime = time4 - time3;
mapReadResults[bIdx][kIdx] = runTime;
blocksUsed[bIdx][kIdx] = dmap.getBlockCount();
long time5 = System.currentTimeMillis();
Random r = new Random();
for (int i = 0; i < keys; ++i) {
int keyInt = r.nextInt(keys);
byte[] key = buf.putInt(keyInt).array();
buf.rewind();
dmap.get(key);
}
long time6 = System.currentTimeMillis();
runTime = time6 - time5;
rndReadResults[bIdx][kIdx] = runTime;
long time7 = System.currentTimeMillis();
DMap.EntryIterator entryIterator = dmap.entryIterator();
while (entryIterator.hasNext()) {
entryIterator.next();
}
long time8 = System.currentTimeMillis();
runTime = time8 - time7;
iterReadResults[bIdx][kIdx] = runTime;
mapFile.delete();
}
}