我看到迭代在Chronicle Map上的時間非常緩慢 - 在下面的示例中,我的2013 MacbookPro上的1M條目每次迭代93ms。我想知道是否有更好的方法來迭代,或者我做錯了什麼,或者如果這是預期的?我知道Chronicle Map並未針對迭代進行優化,但幾年前的this ticket讓我期待更快的迭代時間。玩具下面的例子:Chronicle Map上的迭代非常緩慢
public static void main(String[] args) throws Exception {
int numEntries = 1_000_000;
int numIterations = 1_000;
int avgEntrySize = BitUtil.SIZE_OF_LONG + BitUtil.SIZE_OF_INT;
ChronicleMap<IntValue, ByteBuffer> map = ChronicleMap.of(IntValue.class, ByteBuffer.class)
.name("test").entries(numEntries).averageValueSize(avgEntrySize)
.putReturnsNull(true).create();
IntValue value = Values.newHeapInstance(IntValue.class);
ByteBuffer buffer = ByteBuffer.allocate(avgEntrySize);
for (int i = 0; i < numEntries; i++) {
value.setValue(i);
buffer.clear();
buffer.putLong(i);
buffer.putInt(i);
buffer.flip();
map.put(value, buffer);
}
System.out.println("Finished insertion");
for (int i = 0; i < numIterations; i++) {
map.forEachEntry(entry -> {
Data<ByteBuffer> data = entry.value();
ByteBuffer val = data.get();
});
}
System.out.println("Finished priming");
long start = System.currentTimeMillis();
for (int i = 0; i < numIterations; i++) {
map.forEachEntry(entry -> {
Data<ByteBuffer> data = entry.value();
ByteBuffer val = data.get();
});
}
System.out.println(
"Elapsed: " + (System.currentTimeMillis() - start) + " for " + numIterations
+ " iterations");
}
輸出: 完了完了插入 吸 消逝:93327 1000次迭代
如果你需要比你需要有另外的數據結構來索引數據爲O(n)操作更好。大型地圖的蠻力迭代總是要測試你的硬件。 –
在你提到的票據中,它顯示的條目是指容量不是使用的大小,對於大部分爲空的地圖,它可以加快速度。 –