Caching Example II

In a second example, we add an instance variable to the keys to provide the mapping into the cache. This example uses a circular cache that holds just the last (most recent) 128 keys accessed. This has an even larger speedup than the previous example, due to more optimal cache access:

package tuning.cache; import java.util.Hashtable; import java.lang.Math; public class Test2 { //The cache array for the keys static Test2[] cache_keys = new Test2[128]; //The array for the values corresponding to cached keys static Object[] cache_values = new Object[128]; static Hashtable hash = new Hashtable( ); //The index to use for the next object added to the cache static int freeIndex = 0; //The current index in the cache referenced by this object int cacheRef = -1; //Unique integer for each object, can be used as hash code int value; public static void main(String[] args) { try { System.out.println("started populating"); populate( ); System.out.println("started accessing"); access_test( ); } catch(Exception e){e.printStackTrace( );} } public Test2(int i) { value = i; } public int hashCode( ) { return value; } public boolean equals(Object obj) { //Equality test requires null check, type check, and value check if ((obj != null) && (obj instanceof Test2)) return value == ((Test2) obj).value; else return false; } public static void populate( ) { for (int i = 0; i < 100000; i++) hash.put(new Test2(i), new Integer(i+5)); } public static Object plain_access(Test2 i) { return hash.get(i); ...

Get Java Performance Tuning now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.