Skip to content

Commit 36e1d38

Browse files
committed
Analyze cache misses
1 parent 86e632b commit 36e1d38

File tree

1 file changed

+47
-11
lines changed

1 file changed

+47
-11
lines changed

fastfilter/src/test/java/org/fastfilter/analysis/AnalyzeXorConstructionCacheMisses.java

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,22 @@
66

77
public class AnalyzeXorConstructionCacheMisses {
88
public static void main(String... args) throws Exception {
9-
int size = 1000000;
9+
int size = 10000000;
1010
long[] keys = new long[size];
1111
for (int i = 0; i < size; i++) {
1212
keys[i] = hash64(i, 0);
1313
}
14-
for (Class<? extends Xor> c : Arrays.asList(Xor.class, Fuse.class)) {
14+
for (Class<? extends Xor> c : Arrays.asList(Fuse6.class, Fuse5.class, Fuse4.class, Fuse3.class, Fuse2.class, Fuse.class, Xor.class)) {
1515
Xor filter = c.getConstructor(int.class).newInstance(size);
1616
CacheAccessCallback cache;
1717
cache = new CacheAccessCallback();
18-
filter.access = cache;
18+
// filter.access = cache;
1919
filter.construct1(keys);
20-
System.out.println(filter + " constuct1 cache misses: " + cache.cacheMisses);
20+
// System.out.println(filter + " construct1 cache misses: " + cache.cacheMisses);
2121
cache = new CacheAccessCallback();
2222
filter.access = cache;
2323
filter.construct2();
24-
System.out.println(filter + " constuct2 cache misses: " + cache.cacheMisses);
24+
System.out.println(filter + " construct2 cache misses: " + cache.cacheMisses);
2525
}
2626
}
2727

@@ -164,9 +164,13 @@ static class Fuse extends Xor {
164164
int segmentCount;
165165

166166
public Fuse(int size) {
167+
// segment size for about 0.4 to 1.2 million keys
168+
this(size, 4 * 1024);
169+
}
170+
171+
public Fuse(int size, int segmentLength) {
167172
this.size = size;
168-
// TODO hardcoded, for about 0.4 to 1.2 million keys
169-
this.segmentLength = 4096;
173+
this.segmentLength = segmentLength;
170174
int length = (int) (1.13 * size + segmentLength) / segmentLength * segmentLength;
171175
this.segmentCount = Math.max(1, length / segmentLength - 2);
172176
length = (segmentCount + 2) * segmentLength;
@@ -175,15 +179,47 @@ public Fuse(int size) {
175179
}
176180

177181
public String toString() {
178-
return "Fuse";
182+
return "Fuse size " + size + " segmentCount " + segmentCount + " segmentLength " + segmentLength;
179183
}
180184

181185
protected int[] indexes(long hash) {
182186
int seg = reduce((int) hash64(hash, 0), segmentCount);
183-
int h0 = (seg + 0) * segmentLength + (int) (hash64(hash, 1) & (segmentLength - 1));
184-
int h1 = (seg + 1) * segmentLength + (int) (hash64(hash, 2) & (segmentLength - 1));
185-
int h2 = (seg + 2) * segmentLength + (int) (hash64(hash, 3) & (segmentLength - 1));
187+
int h0 = (seg + 0) * segmentLength + (int) Math.floorMod(hash64(hash, 1), segmentLength);
188+
int h1 = (seg + 1) * segmentLength + (int) Math.floorMod(hash64(hash, 2), segmentLength);
189+
int h2 = (seg + 2) * segmentLength + (int) Math.floorMod(hash64(hash, 3), segmentLength);
186190
return new int[] { h0, h1, h2 };
187191
}
188192
}
193+
194+
static class Fuse2 extends Fuse {
195+
public Fuse2(int size) {
196+
super(size, 8 * 1024);
197+
}
198+
}
199+
200+
static class Fuse3 extends Fuse {
201+
public Fuse3(int size) {
202+
super(size, 16 * 1024);
203+
}
204+
}
205+
206+
static class Fuse4 extends Fuse {
207+
public Fuse4(int size) {
208+
super(size, (int)(size * 1.13) / 320);
209+
}
210+
}
211+
212+
static class Fuse5 extends Fuse {
213+
public Fuse5(int size) {
214+
super(size, (int)(size * 1.13) / 240);
215+
}
216+
}
217+
218+
static class Fuse6 extends Fuse {
219+
public Fuse6(int size) {
220+
super(size, (int)(size * 1.13) / 160);
221+
}
222+
}
223+
224+
189225
}

0 commit comments

Comments
 (0)