/** * */ package net.varkhan.base.containers.set; import junit.framework.TestCase; import java.io.*; import java.util.Random; /** * @author varkhan * @date Feb 26, 2010 * @time 8:14:25 PM */ public class ObjectSetBmrk extends TestCase { long seed=1234567890987654321L; public void testOpenHashSet() { for(int i=0;i<10;i++) benchmarkJavaSet(1000000, new java.util.HashSet<String>(), false); benchmarkJavaSet(1000000, new java.util.HashSet<String>(), true); } public void testArrayOpenHashSet() { for(int i=0;i<10;i++) benchmarkSet(1000000, new BlockOpenHashSet<String>(), false); benchmarkSet(1000000, new ArrayOpenHashSet<String>(), true); } public void testBlockOpenHashSet() { for(int i=0;i<10;i++) benchmarkSet(1000000, new BlockOpenHashSet<String>(), false); benchmarkSet(1000000, new BlockOpenHashSet<String>(), true); } private String[] generateStrings(int num, int minl, int maxl, char[] characters) { Random rand=new Random(seed); String[] a=new String[num]; for(int i=0;i<num;i++) { StringBuilder buf=new StringBuilder(); int len=minl+rand.nextInt(maxl-minl); for(int j=0;j<len;j++) buf.append(characters[rand.nextInt(characters.length)]); a[i]=buf.toString(); } return a; } public void benchmarkSet(int num, Set<String> set, boolean pre) { if(pre) System.out.println("Bmrk "+set.getClass().getSimpleName()); String[] a=generateStrings(num, 2, 5, "abcdefghijklmnopqrstuvwxyz".toCharArray()); boolean ok; long t0, t1; // Testing key adding t0=System.nanoTime(); ok=true; for(int i=0;i<a.length;i++) { set.add(a[i]); } t1=System.nanoTime(); if(pre) { assertTrue("add", ok); System.out.println("add() OK in "+((t1-t0)/1000)+"ms ("+((t1-t0)/a.length)+"ns/key)"); } // Testing if keys are present t0=System.nanoTime(); ok=true; for(int i=0;i<a.length;i++) { String s=a[i]; ok&=set.has(s); } t1=System.nanoTime(); if(pre) { assertTrue("has", ok); System.out.println("has() OK in "+((t1-t0)/1000)+"ms ("+((t1-t0)/a.length)+"ns/key)"); } // Get serial size if(pre) { long s=getSerialSize(set); System.out.println("Size is "+s+" bytes ("+(s/(double)a.length)+" b/key)"); } // Testing forward delete (no resize) t0=System.nanoTime(); ok=true; for(int i=0;i<a.length;i++) { set.del(a[i]); } t1=System.nanoTime(); if(pre) { assertTrue("del", ok); System.out.println("del() OK in "+((t1-t0)/1000)+"ms ("+((t1-t0)/a.length)+"ns/key)"); } // Testing backward delete (implies auto resize) for(int i=0;i<a.length;i++) { set.add(a[i]); } t0=System.nanoTime(); ok=true; for(int i=a.length-1;i>=0;i--) { set.del(a[i]); } t1=System.nanoTime(); if(pre) { assertTrue("del rev", ok); System.out.println("del() reverse OK in "+((t1-t0)/1000)+"ms ("+((t1-t0)/a.length)+"ns/key)"); } if(pre) System.out.println(); } public void benchmarkJavaSet(int num, java.util.Set<String> set, boolean pre) { if(pre) System.out.println("Bmrk "+set.getClass().getSimpleName()); String[] a=generateStrings(num, 2, 5, "abcdefghijklmnopqrstuvwxyz".toCharArray()); boolean ok; long t0, t1; // Testing key adding t0=System.nanoTime(); ok=true; for(int i=0;i<a.length;i++) { set.add(a[i]); } t1=System.nanoTime(); if(pre) { assertTrue("add", ok); System.out.println("add() OK in "+((t1-t0)/1000)+"ms ("+((t1-t0)/a.length)+"ns/key)"); } // Testing if keys are present t0=System.nanoTime(); ok=true; for(int i=0;i<a.length;i++) { String s=a[i]; ok&=set.contains(s); } t1=System.nanoTime(); if(pre) { assertTrue("contains", ok); System.out.println("contains() OK in "+((t1-t0)/1000)+"ms ("+((t1-t0)/a.length)+"ns/key)"); } // Get serial size if(pre) { long s=getSerialSize(set); System.out.println("Size is "+s+" bytes ("+(s/(double)a.length)+" b/key)"); } // Testing forward delete (no resize) t0=System.nanoTime(); ok=true; for(int i=0;i<a.length;i++) { set.remove(a[i]); } t1=System.nanoTime(); if(pre) { assertTrue("del", ok); System.out.println("del() OK in "+((t1-t0)/1000)+"ms ("+((t1-t0)/a.length)+"ns/key)"); } // Testing backward delete (implies auto resize) for(int i=0;i<a.length;i++) { set.add(a[i]); } t0=System.nanoTime(); ok=true; for(int i=a.length-1;i>=0;i--) { set.remove(a[i]); } t1=System.nanoTime(); if(pre) { assertTrue("del rev", ok); System.out.println("del() reverse OK in "+((t1-t0)/1000)+"ms ("+((t1-t0)/a.length)+"ns/key)"); } if(pre) System.out.println(); } private long getSerialSize(Object o) { if(!(o instanceof Serializable)) return -1; File t; try { t=File.createTempFile("/tmp", ".ser"); } catch(IOException e) { return -1; } ObjectOutputStream os=null; try { os=new ObjectOutputStream(new FileOutputStream(t)); os.writeObject(o); return t.length(); } catch(NotSerializableException e) { return -1; } catch(Exception e) { e.printStackTrace(); return -1; } finally { if(os!=null) try {os.close();} catch(Throwable e) {} t.delete(); } } }