CalculateAverage_gonix update (#579)
Minor updates here and there, shaves off ~5% of execution time on my machine.
This commit is contained in:
parent
cb7423d386
commit
27b867d10d
@ -79,13 +79,13 @@ public class CalculateAverage_gonix {
|
|||||||
|
|
||||||
class Aggregator {
|
class Aggregator {
|
||||||
private static final int MAX_STATIONS = 10_000;
|
private static final int MAX_STATIONS = 10_000;
|
||||||
private static final int MAX_STATION_SIZE = (100 * 4) / 8 + 5;
|
private static final int MAX_STATION_SIZE = Math.ceilDiv(100, 8) + 5;
|
||||||
private static final int INDEX_SIZE = 1024 * 1024;
|
private static final int INDEX_SIZE = 1024 * 1024;
|
||||||
private static final int INDEX_MASK = INDEX_SIZE - 1;
|
private static final int INDEX_MASK = INDEX_SIZE - 1;
|
||||||
private static final int FLD_MAX = 0;
|
private static final int FLD_COUNT = 0;
|
||||||
private static final int FLD_MIN = 1;
|
private static final int FLD_SUM = 1;
|
||||||
private static final int FLD_SUM = 2;
|
private static final int FLD_MIN = 2;
|
||||||
private static final int FLD_COUNT = 3;
|
private static final int FLD_MAX = 3;
|
||||||
|
|
||||||
// Poor man's hash map: hash code to offset in `mem`.
|
// Poor man's hash map: hash code to offset in `mem`.
|
||||||
private final int[] index;
|
private final int[] index;
|
||||||
@ -205,27 +205,15 @@ class Aggregator {
|
|||||||
|
|
||||||
private void add(ByteBuffer buf, int start, long tailAndLen, int hash, int measurement) {
|
private void add(ByteBuffer buf, int start, long tailAndLen, int hash, int measurement) {
|
||||||
int idx = hash & INDEX_MASK;
|
int idx = hash & INDEX_MASK;
|
||||||
while (true) {
|
for (; index[idx] != 0; idx = (idx + 1) & INDEX_MASK) {
|
||||||
if (index[idx] != 0) {
|
if (update(index[idx], buf, start, tailAndLen, measurement)) {
|
||||||
int offset = index[idx];
|
|
||||||
if (keyEqual(offset, buf, start, tailAndLen)) {
|
|
||||||
int pos = offset + (int) (tailAndLen & 0xFF) + 1;
|
|
||||||
mem[pos + FLD_MIN] = Math.min((int) measurement, (int) mem[pos + FLD_MIN]);
|
|
||||||
mem[pos + FLD_MAX] = Math.max((int) measurement, (int) mem[pos + FLD_MAX]);
|
|
||||||
mem[pos + FLD_SUM] += measurement;
|
|
||||||
mem[pos + FLD_COUNT] += 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
index[idx] = create(buf, start, tailAndLen, hash, measurement);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
idx = (idx + 1) & INDEX_MASK;
|
|
||||||
}
|
}
|
||||||
|
index[idx] = create(buf, start, tailAndLen, measurement);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int create(ByteBuffer buf, int start, long tailAndLen, int hash, int measurement) {
|
private int create(ByteBuffer buf, int start, long tailAndLen, int measurement) {
|
||||||
int offset = memUsed;
|
int offset = memUsed;
|
||||||
|
|
||||||
mem[offset] = tailAndLen;
|
mem[offset] = tailAndLen;
|
||||||
@ -248,8 +236,8 @@ class Aggregator {
|
|||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean keyEqual(int offset, ByteBuffer buf, int start, long tailAndLen) {
|
private boolean update(int offset, ByteBuffer buf, int start, long tailAndLen, int measurement) {
|
||||||
|
var mem = this.mem;
|
||||||
if (mem[offset] != tailAndLen) {
|
if (mem[offset] != tailAndLen) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -263,6 +251,16 @@ class Aggregator {
|
|||||||
memPos += 1;
|
memPos += 1;
|
||||||
bufPos += 8;
|
bufPos += 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mem[memPos + FLD_COUNT] += 1;
|
||||||
|
mem[memPos + FLD_SUM] += measurement;
|
||||||
|
if (measurement < mem[memPos + FLD_MIN]) {
|
||||||
|
mem[memPos + FLD_MIN] = measurement;
|
||||||
|
}
|
||||||
|
if (measurement > mem[memPos + FLD_MAX]) {
|
||||||
|
mem[memPos + FLD_MAX] = measurement;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user