6
6
7
7
public class AnalyzeXorConstructionCacheMisses {
8
8
public static void main (String ... args ) throws Exception {
9
- int size = 1000000 ;
9
+ int size = 10000000 ;
10
10
long [] keys = new long [size ];
11
11
for (int i = 0 ; i < size ; i ++) {
12
12
keys [i ] = hash64 (i , 0 );
13
13
}
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 )) {
15
15
Xor filter = c .getConstructor (int .class ).newInstance (size );
16
16
CacheAccessCallback cache ;
17
17
cache = new CacheAccessCallback ();
18
- filter .access = cache ;
18
+ // filter.access = cache;
19
19
filter .construct1 (keys );
20
- System .out .println (filter + " constuct1 cache misses: " + cache .cacheMisses );
20
+ // System.out.println(filter + " construct1 cache misses: " + cache.cacheMisses);
21
21
cache = new CacheAccessCallback ();
22
22
filter .access = cache ;
23
23
filter .construct2 ();
24
- System .out .println (filter + " constuct2 cache misses: " + cache .cacheMisses );
24
+ System .out .println (filter + " construct2 cache misses: " + cache .cacheMisses );
25
25
}
26
26
}
27
27
@@ -164,9 +164,13 @@ static class Fuse extends Xor {
164
164
int segmentCount ;
165
165
166
166
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 ) {
167
172
this .size = size ;
168
- // TODO hardcoded, for about 0.4 to 1.2 million keys
169
- this .segmentLength = 4096 ;
173
+ this .segmentLength = segmentLength ;
170
174
int length = (int ) (1.13 * size + segmentLength ) / segmentLength * segmentLength ;
171
175
this .segmentCount = Math .max (1 , length / segmentLength - 2 );
172
176
length = (segmentCount + 2 ) * segmentLength ;
@@ -175,15 +179,47 @@ public Fuse(int size) {
175
179
}
176
180
177
181
public String toString () {
178
- return "Fuse" ;
182
+ return "Fuse size " + size + " segmentCount " + segmentCount + " segmentLength " + segmentLength ;
179
183
}
180
184
181
185
protected int [] indexes (long hash ) {
182
186
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 );
186
190
return new int [] { h0 , h1 , h2 };
187
191
}
188
192
}
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
+
189
225
}
0 commit comments