/**
*
*/
package net.varkhan.base.containers.set;
import junit.framework.TestCase;
import java.io.*;
import java.util.Random;
/**
* @author varkhan
* @date May 21, 2009
* @time 12:13:22 AM
*/
public class IndexedObjectSetBmrk extends TestCase {
long seed=1234567890987654321L;
public void testArrayOpenHashIndexedSet() {
for(int i=0;i<10;i++) benchmarkIndexedSet(1000000, new ArrayOpenHashIndexedSet<String>(), false);
benchmarkIndexedSet(1000000, new ArrayOpenHashIndexedSet<String>(), true);
}
public void testAbstractArrayOpenHashIndexedSet() {
for(int i=0;i<10;i++)
benchmarkIndexedSet(1000000, new AbstractArrayOpenHashIndexedSet<String>() {
private static final long serialVersionUID=1L;
}, false);
benchmarkIndexedSet(1000000, new AbstractArrayOpenHashIndexedSet<String>() {
private static final long serialVersionUID=1L;
}, true);
}
public void testBlockOpenHashIndexedSet() {
for(int i=0;i<10;i++) benchmarkIndexedSet(1000000, new BlockOpenHashIndexedSet<String>(), false);
benchmarkIndexedSet(1000000, new BlockOpenHashIndexedSet<String>(), true);
}
public void testAbstractBlockOpenHashIndexedSet() {
for(int i=0;i<10;i++)
benchmarkIndexedSet(1000000, new AbstractBlockOpenHashIndexedSet<String>() {
private static final long serialVersionUID=1L;
}, false);
benchmarkIndexedSet(1000000, new AbstractBlockOpenHashIndexedSet<String>() {
private static final long serialVersionUID=1L;
}, 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 benchmarkIndexedSet(int num, IndexedSet<String> set, boolean pre) {
if(pre) System.out.println("Bmrk "+set.getClass().getSimpleName());
String[] a=generateStrings(num, 2, 5, "abcdefghijklmnopqrstuvwxyz".toCharArray());
long[] x=new long[a.length];
boolean ok;
long t0, t1;
// Testing key adding
t0=System.nanoTime();
ok=true;
for(int i=0;i<a.length;i++) {
String s=a[i];
long idx=set.add(s);
x[i]=idx;
ok&=idx>=0;
}
t1=System.nanoTime();
if(pre) {
assertTrue("add", ok);
System.out.println("add() in "+((t1-t0)/1000)+"ms ("+((t1-t0)/a.length)+"ns/key)");
}
// Testing if indexes can be retrieved
t0=System.nanoTime();
ok=true;
for(int i=0;i<a.length;i++) {
String s=a[i];
long idx=set.index(s);
ok&=idx==x[i];
}
t1=System.nanoTime();
if(pre) {
assertTrue("index", ok);
System.out.println("index() 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++) {
long idx=x[i];
set.del(idx);
}
t1=System.nanoTime();
if(pre) {
assertTrue("del", ok);
System.out.println("del() 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++) {
x[i]=set.add(a[i]);
}
t0=System.nanoTime();
ok=true;
for(int i=a.length-1;i>=0;i--) {
long idx=x[i];
set.del(idx);
}
t1=System.nanoTime();
if(pre) {
assertTrue("del rev", ok);
System.out.println("del() reverse 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();
}
}
}