66
77public 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