package com.bigdata.btree;
import java.io.IOException;
import java.util.Random;
import com.bigdata.util.BytesUtil;
/**
* Rather than run in a JUnit, the performance tests are best run
* standalone.
*
* @author Martyn Cutcher
*
*/
public class TestGetBitsApplication {
public static void test_perf_getBits7() throws IOException {
doTestBits32("test_perf_getBits7", 7);
}
public static void test_perf_getBits10() throws IOException {
doTestBits32("test_perf_getBits10", 10);
}
public static void test_perf_getBits21() throws IOException {
doTestBits32("test_perf_getBits21", 21);
}
public static void test_perf_getBits47() throws IOException {
doTestBits64("test_perf_getBits47", 47);
}
static void doTestBits32(final String msg, final int bits) throws IOException {
final Random r = new Random();
// #of
final int limit = 1000000000; // 100000000;
// Note: length is guaranteed to be LT int32 bits so [int] index is Ok.
final int len = 124500; // + r.nextInt(Bytes.kilobyte32 * 8) + 1;
final int bitlen = len << 3;
// Fill array with random data.
final byte[] b = new byte[len];
r.nextBytes(b);
int[] sliceOffsets = new int[] {
1245,
12450,
102000,
80000,
120000
};
int runs = 0;
long start = System.currentTimeMillis();
for (int i = 0; i < limit; i++) {
// start of the bit slice.
final int sliceBitOff = sliceOffsets[i%5]; // r.nextInt(bitlen - 64);
final int bitsremaining = bitlen - sliceBitOff;
// allow any slice of between 1 and 32 bits length.
final int sliceBitLen = bits; // r.nextInt(Math.min(64, bitsremaining)) + 1;
assert sliceBitLen >= 1 && sliceBitLen <= bits;
BytesUtil.getBits(b, sliceBitOff, sliceBitLen);
runs++;
}
System.out.println(msg + " completed: " + runs + ", in " + (System.currentTimeMillis()-start) + "ms");
}
public static void test_perf_tstGetBits7() throws IOException {
doAltTestBits32("test_perf_tstGetBits7", 7);
}
public static void test_perf_tstGetBits10() throws IOException {
doAltTestBits32("test_perf_tstGetBits10", 10);
}
public static void test_perf_tstGetBits21() throws IOException {
doAltTestBits32("test_perf_tstGetBits21", 21);
}
public static void test_perf_tstGetBits47() throws IOException {
doAltTestBits64("test_perf_tstGetBits47", 47);
}
static void doAltTestBits32(final String msg, final int bits) throws IOException {
final Random r = new Random();
// #of
final int limit = 1000000000; // 100000000;
// Note: length is guaranteed to be LT int32 bits so [int] index is Ok.
final int len = 124500; // + r.nextInt(Bytes.kilobyte32 * 8) + 1;
final int bitlen = len << 3;
// Fill array with random data.
final byte[] b = new byte[len];
r.nextBytes(b);
int[] sliceOffsets = new int[] {
1245,
12450,
102000,
80000,
120000
};
int runs = 0;
long start = System.currentTimeMillis();
for (int i = 0; i < limit; i++) {
// start of the bit slice.
final int sliceBitOff = sliceOffsets[i%5]; // r.nextInt(bitlen - 64);
final int bitsremaining = bitlen - sliceBitOff;
// allow any slice of between 1 and 32 bits length.
final int sliceBitLen = bits; // r.nextInt(Math.min(64, bitsremaining)) + 1;
assert sliceBitLen >= 1 && sliceBitLen <= 32;
BytesUtil.altGetBits32(b, sliceBitOff, sliceBitLen);
runs++;
}
System.out.println(msg + " completed: " + runs + ", in " + (System.currentTimeMillis()-start) + "ms");
}
static void doAltTestBits64(final String msg, final int bits) throws IOException {
final Random r = new Random();
// #of
final int limit = 500000000; // 100000000;
// Note: length is guaranteed to be LT int32 bits so [int] index is Ok.
final int len = 124500; // + r.nextInt(Bytes.kilobyte32 * 8) + 1;
final int bitlen = len << 3;
// Fill array with random data.
final byte[] b = new byte[len];
r.nextBytes(b);
int[] sliceOffsets = new int[] {
1245,
12450,
102000,
80000,
120000
};
int runs = 0;
long start = System.currentTimeMillis();
for (int i = 0; i < limit; i++) {
// start of the bit slice.
final int sliceBitOff = sliceOffsets[i%5]; // r.nextInt(bitlen - 64);
final int bitsremaining = bitlen - sliceBitOff;
// allow any slice of between 1 and 32 bits length.
final int sliceBitLen = bits; // r.nextInt(Math.min(64, bitsremaining)) + 1;
assert sliceBitLen >= 1 && sliceBitLen <= 32;
BytesUtil.altGetBits64(b, sliceBitOff, sliceBitLen);
runs++;
}
System.out.println(msg + " completed: " + runs + ", in " + (System.currentTimeMillis()-start) + "ms");
}
static void doTestBits64(final String msg, final int bits) throws IOException {
final Random r = new Random();
// #of
final int limit = 500000000; // 100000000;
// Note: length is guaranteed to be LT int32 bits so [int] index is Ok.
final int len = 124500; // + r.nextInt(Bytes.kilobyte32 * 8) + 1;
final int bitlen = len << 3;
// Fill array with random data.
final byte[] b = new byte[len];
r.nextBytes(b);
int[] sliceOffsets = new int[] {
1245,
12450,
102000,
80000,
120000
};
int runs = 0;
long start = System.currentTimeMillis();
for (int i = 0; i < limit; i++) {
// start of the bit slice.
final int sliceBitOff = sliceOffsets[i%5]; // r.nextInt(bitlen - 64);
final int bitsremaining = bitlen - sliceBitOff;
// allow any slice of between 1 and 32 bits length.
final int sliceBitLen = bits; // r.nextInt(Math.min(64, bitsremaining)) + 1;
assert sliceBitLen >= 1 && sliceBitLen <= 32;
BytesUtil.getBits64(b, sliceBitOff, sliceBitLen);
runs++;
}
System.out.println(msg + " completed: " + runs + ", in " + (System.currentTimeMillis()-start) + "ms");
}
public static void main(String[] args) throws IOException {
test_perf_tstGetBits7();
test_perf_getBits7();
test_perf_tstGetBits10();
test_perf_getBits10();
test_perf_tstGetBits21();
test_perf_getBits21();
test_perf_tstGetBits47();
test_perf_getBits47();
System.out.println("All done!");
}
}