package gnu.trove.benchmark;
import gnu.trove.map.TObjectLongMap;
import gnu.trove.map.hash.TObjectLongHashMap;
import gnu.trove.procedure.TObjectProcedure;
import java.text.NumberFormat;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
/**
*
*/
public class MapHammer {
public static void main( String[] args ) {
final TObjectLongMap<Integer> map = new TObjectLongHashMap<Integer>( 10000 );
// // Disable auto-compaction
// ( ( TObjectLongHashMap ) map ).setAutoCompactionFactor( 0 );
final Integer[] OBJECTS = new Integer[ 100000 ];
for( int i = 0; i < OBJECTS.length; i++ ) {
OBJECTS[ i ] = Integer.valueOf( i );
}
Random rand = new Random();
final AtomicInteger adds = new AtomicInteger( 0 );
final AtomicInteger edits = new AtomicInteger( 0 );
final AtomicInteger removes = new AtomicInteger( 0 );
final AtomicBoolean compact_flag = new AtomicBoolean( false );
Timer stat_timer = new Timer();
stat_timer.schedule( new TimerTask() {
int run_count = 0;
long start = System.currentTimeMillis();
long total_ops;
@Override
public void run() {
run_count++;
if ( run_count == 60 ) {
long duration = System.currentTimeMillis() - start;
System.out.println( "Total ops: " + total_ops + " Ops/sec: " +
NumberFormat.getNumberInstance().format( total_ops /
( duration / 1000.0 ) ) );
System.exit( 0 );
}
int local_adds = adds.getAndSet( 0 );
int local_edits = edits.getAndSet( 0 );
int local_removes = removes.getAndSet( 0 );
// long local_compactions = ( ( THash ) map ).compactions.getAndSet( 0 );
long total_ops = ( long ) local_adds + ( long ) local_edits +
( long ) local_removes;
this.total_ops += total_ops;
// compact_flag.set( true );
System.out.println( "A: " + local_adds + " E: " + local_edits +
" R: " + local_removes + " Size: " + map.size() +
// " Compact: " + local_compactions +
" Ops/sec: " + total_ops );
}
}, 1000, 1000 );
// stat_timer.schedule( new TimerTask() {
// @Override
// public void run() {
// compact_flag.set( true );
// }
// }, 100, 100 );
FirstValueSlot proc = new FirstValueSlot();
//noinspection InfiniteLoopStatement
while( true ) {
if ( compact_flag.compareAndSet( true, false ) ) {
( ( TObjectLongHashMap ) map ).compact();
}
int num = rand.nextInt( 3 );
if ( num == 0 || map.isEmpty() ) {
map.put( OBJECTS[ rand.nextInt( OBJECTS.length ) ], 0 );
adds.incrementAndGet();
}
else {
// Get a random value
map.forEachKey( proc );
Integer key = proc.key;
if ( num == 1 ) {
map.remove( key );
removes.incrementAndGet();
}
else {
map.increment( key );
edits.incrementAndGet();
}
}
}
}
private static class FirstValueSlot implements TObjectProcedure<Integer> {
private volatile Integer key = null;
@Override
public boolean execute( Integer integer ) {
key = integer;
return false;
}
}
}