package ser.offheaplatency; import java.io.*; import java.util.concurrent.*; import org.HdrHistogram.*; import org.nustaq.serialization.simpleapi.*; public final class TestFSTSerializer { protected static void printResult( Histogram histogram ){ System.out.println( "\nDetail Result (in micros)"); System.out.println( "------------------------------------------------------------------"); histogram.outputPercentileDistribution( System.out, 1000.0 ); double valueAt99Percentile = histogram.getValueAtPercentile( 99.99d ); System.out.println( "\nValue 99.99th percentile >> " + valueAt99Percentile/1000.0 ); } protected static MyFSTSerializer createFSTSerializer( boolean toStore, int eventCount, int memorySizeOf1Object ) throws Exception{ long expectedMemory = memorySizeOf1Object * eventCount; // String fileLocation = "C:\\Temp"; String fileLocation = "/tmp"; String journalName = "Test"; MyFSTSerializer ser = new MyFSTSerializer( toStore, fileLocation, journalName, new DefaultCoder(), expectedMemory, eventCount ); return ser; } protected static void destroyFSTSerializer( MyFSTSerializer serializer ){ if( serializer != null ){ serializer.stop(); boolean deleted = new File( serializer.getFilename() ).delete(); if( deleted ){ System.out.println( "Deleted file from " + serializer.getFilename()); }else{ // throw new RuntimeException( "TEST FAILED as we failed to delete file " + serializer.getFilename() ); } } } public static void testOffHeapPersistence( ){ MyFSTSerializer serializer= null; try{ int eventCount = 50000; int memorySizeOf1Object = 1000; Histogram histogram = new Histogram( TimeUnit.NANOSECONDS.convert(1, TimeUnit.SECONDS), 2); System.out.println( "Testing off heap persistence performance of FSTLongOffheapMap by storing " + eventCount + " events."); serializer = createFSTSerializer( true, eventCount, memorySizeOf1Object ); serializer.start( ); for( int i =0; i<eventCount; i++ ){ MktDataEvent event = new MktDataEvent( "EDM6", 99.0, (100 + i), 99.50, (200 + i) ); serializer.storeEvent( event ); histogram.recordValue(System.nanoTime() - event.getCreationTime() ); } int retrievedEventSize = serializer.retrieveAllEvents().size(); if( eventCount != retrievedEventSize ) throw new RuntimeException("Store failed as we stored " + eventCount + " events but retrieved " + retrievedEventSize ); printResult( histogram ); }catch( Exception e ){ throw new RuntimeException("TEST FAILED as ", e); }finally{ destroyFSTSerializer( serializer ); } } public static void testDispatchAndPersistence( boolean toStore ) throws Exception{ int eventCount = 50000; int memorySizeOf1Object = 1000; DummyListener listener = new DummyListener( ); MyFSTSerializer serializer = createFSTSerializer( toStore, eventCount, memorySizeOf1Object ); MktDataDispatcher dispatcher = new MktDataDispatcher( eventCount, serializer, listener ); if( toStore ){ System.out.println( "Testing off heap persistence with dispathcer performance of FSTLongOffheapMap by storing " + eventCount + " events."); }else{ System.out.println( "Testing off heap persistence with dispathcer performance of FSTLongOffheapMap WITHOUT storing " + eventCount + " events."); } dispatcher.start(); Thread.sleep( 3000 ); for( int i = 0; i< eventCount; i++ ){ MktDataEvent event = new MktDataEvent( "EDM6", 99.0, (100 + i), 99.50, (200 + i) ); dispatcher.enqueue( event ); long nanos = System.nanoTime(); while( System.nanoTime() - nanos < 3000 ) Thread.yield(); } //Let the listener get all the elements while( (dispatcher.getQueueSize() != 0) ){ Thread.sleep(100); } Thread.sleep( 2000 ); dispatcher.stop(); listener.generateLatencyStats(); destroyFSTSerializer( serializer ); } public static class DummyListener implements MktDataDispatcher.MktDataListener { private final Histogram histogram; public DummyListener( ){ this.histogram = new Histogram( TimeUnit.NANOSECONDS.convert(1, TimeUnit.SECONDS), 2); } @Override public final boolean update( MktDataEvent event ){ histogram.recordValue( (System.nanoTime() - event.getCreationTime()) ); return true; } public final void generateLatencyStats( ){ histogram.outputPercentileDistribution( System.out, 1000.0 ); double valueAt99Percentile = histogram.getValueAtPercentile( 99.99d ); System.out.println( "\nValue at 99.99th percentile (micros) >> " + valueAt99Percentile/1000.0 ); } } public static void main( String ... args ) throws Exception{ for (int i = 0; i < 1000; i++) { System.gc(); Thread.sleep( 2000 ); System.out.println("start test ==>"); testDispatchAndPersistence( true ); // testOffHeapPersistence(); } // System.gc(); // Thread.sleep( 2000 ); // testDispatchAndPersistence( true ); // testDispatchAndPersistence( true ); // testDispatchAndPersistence( true ); } }