in src/main/java/org/apache/datasketches/cpc/CompressionCharacterization.java [134:303]
private void doTrialsAtLgKAtN(final int lgK, final long n, final int totalTrials) {
final int k = 1 << lgK;
final int minNK = (int) ((k < n) ? k : n);
final double nOverK = (double) n / k;
final int lgTotTrials = Integer.numberOfTrailingZeros(totalTrials);
final int lgWaves = Math.max(lgTotTrials - 10, 0);
final int trialsPerWave = 1 << (lgTotTrials - lgWaves);
//printf("%d %d %d %d\n", totalTrials, lgTotTrials, 1 << lgWaves, trialsPerWave);
streamSketches = new CpcSketch[trialsPerWave];
compressedStates1 = new CompressedState[trialsPerWave];
memoryArr = new WritableMemory[trialsPerWave];
compressedStates2 = new CompressedState[trialsPerWave];
unCompressedSketches = new CpcSketch[trialsPerWave];
//update: fill, compress, uncompress sketches arrays in waves
long totalC = 0;
long totalW = 0;
long sumCtor_nS = 0;
long sumUpd_nS = 0;
long sumCom_nS = 0;
long sumSer_nS = 0;
long sumDes_nS = 0;
long sumUnc_nS = 0;
long sumEqu_nS = 0;
long nanoStart, nanoEnd;
final long start = System.currentTimeMillis();
//Wave Loop
for (int w = 0; w < (1 << lgWaves); w++) {
//Construct array with sketches loop
nanoStart = System.nanoTime();
for (int trial = 0; trial < trialsPerWave; trial++) {
final CpcSketch sketch = new CpcSketch(lgK);
streamSketches[trial] = sketch;
}
nanoEnd = System.nanoTime();
sumCtor_nS += nanoEnd - nanoStart;
nanoStart = nanoEnd;
//Sketch Update loop
for (int trial = 0; trial < trialsPerWave; trial++) {
final CpcSketch sketch = streamSketches[trial];
for (long i = 0; i < n; i++) { //increment loop
sketch.update(vIn += INVERSE_GOLDEN_U64);
}
}
nanoEnd = System.nanoTime();
sumUpd_nS += nanoEnd - nanoStart;
nanoStart = nanoEnd;
//Compress loop
for (int trial = 0; trial < trialsPerWave; trial++) {
final CpcSketch sketch = streamSketches[trial];
final CompressedState state = CompressedState.compress(sketch);
compressedStates1[trial] = state;
totalC += sketch.numCoupons;
totalW += state.csvLengthInts + state.cwLengthInts;
}
nanoEnd = System.nanoTime();
sumCom_nS += nanoEnd - nanoStart;
nanoStart = nanoEnd;
//State to Memory loop
for (int trial = 0; trial < trialsPerWave; trial++) {
final CompressedState state = compressedStates1[trial];
final long cap = state.getRequiredSerializedBytes();
final WritableMemory wmem = WritableMemory.allocate((int) cap);
state.exportToMemory(wmem);
memoryArr[trial] = wmem;
}
nanoEnd = System.nanoTime();
sumSer_nS += nanoEnd - nanoStart;
nanoStart = nanoEnd;
//Memory to State loop
for (int trial = 0; trial < trialsPerWave; trial++) {
final Memory mem = memoryArr[trial];
final CompressedState state = importFromMemory(mem);
compressedStates2[trial] = state;
}
nanoEnd = System.nanoTime();
sumDes_nS += nanoEnd - nanoStart;
nanoStart = nanoEnd;
//Uncompress loop
for (int trial = 0; trial < trialsPerWave; trial++) {
final CompressedState state = compressedStates2[trial];
CpcSketch uncSk = null;
uncSk = CpcSketch.uncompress(state, ThetaUtil.DEFAULT_UPDATE_SEED);
unCompressedSketches[trial] = uncSk;
}
nanoEnd = System.nanoTime();
sumUnc_nS += nanoEnd - nanoStart;
nanoStart = nanoEnd;
//Equals check
for (int trial = 0; trial < trialsPerWave; trial++) {
rtAssert(TestUtil.specialEquals(streamSketches[trial], unCompressedSketches[trial], false, false));
}
nanoEnd = System.nanoTime();
sumEqu_nS += nanoEnd - nanoStart;
nanoStart = nanoEnd;
} // end wave loop
final double total_S = (System.currentTimeMillis() - start) / 1E3;
final double avgC = (1.0 * totalC) / totalTrials;
final double avgCoK = avgC / k;
final double avgWords = (1.0 * totalW) / totalTrials;
final double avgBytes = (4.0 * totalW) / totalTrials;
final double avgCtor_nS = Math.round((double) sumCtor_nS / totalTrials);
final double avgUpd_nS = Math.round((double) sumUpd_nS / totalTrials);
final double avgUpd_nSperN = avgUpd_nS / n;
final double avgCom_nS = Math.round((double) sumCom_nS / totalTrials);
final double avgCom_nSper2C = avgCom_nS / (2.0 * avgC);
final double avgCom_nSperK = avgCom_nS / k;
final double avgSer_nS = Math.round((double) sumSer_nS / totalTrials);
final double avgSer_nSperW = avgSer_nS / avgWords;
final double avgDes_nS = Math.round((double) sumDes_nS / totalTrials);
final double avgDes_nSperW = avgDes_nS / avgWords;
final double avgUnc_nS = Math.round((double) sumUnc_nS / totalTrials);
final double avgUnc_nSper2C = avgUnc_nS / (2.0 * avgC);
final double avgUnc_nSperK = avgUnc_nS / k;
final double avgEqu_nS = Math.round((double) sumEqu_nS / totalTrials);
final double avgEqu_nSperMinNK = avgEqu_nS / minNK;
final int len = unCompressedSketches.length;
final Flavor finFlavor = unCompressedSketches[len - 1].getFlavor();
final String offStr = Integer.toString(unCompressedSketches[len - 1].windowOffset);
final String flavorOff = finFlavor.toString() + String.format("%2s", offStr);
printf(dfmt,
lgK,
totalTrials,
n,
minNK,
avgCoK,
flavorOff,
nOverK,
avgBytes,
avgCtor_nS,
avgUpd_nS,
avgCom_nS,
avgSer_nS,
avgDes_nS,
avgUnc_nS,
avgEqu_nS,
avgUpd_nSperN,
avgCom_nSper2C,
avgCom_nSperK,
avgSer_nSperW,
avgDes_nSperW,
avgUnc_nSper2C,
avgUnc_nSperK,
avgEqu_nSperMinNK,
total_S);
}