package org.juxtapose.streamline.protocol.message;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import org.juxtapose.streamline.protocol.message.StreamDataProtocol.BigDecimalEntry;
import org.juxtapose.streamline.protocol.message.StreamDataProtocol.BooleanEntry;
import org.juxtapose.streamline.protocol.message.StreamDataProtocol.DataMap;
import org.juxtapose.streamline.protocol.message.StreamDataProtocol.HashMapEntry;
import org.juxtapose.streamline.protocol.message.StreamDataProtocol.Message;
import org.juxtapose.streamline.protocol.message.StreamDataProtocol.NullEntry;
import org.juxtapose.streamline.protocol.message.StreamDataProtocol.StringEntry;
import org.juxtapose.streamline.protocol.message.StreamDataProtocol.StringMap;
import org.juxtapose.streamline.util.data.DataType;
import org.juxtapose.streamline.util.data.DataTypeBigDecimal;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.trifork.clj_ds.IPersistentMap;
import com.trifork.clj_ds.PersistentHashMap;
public class Test {
public static Map<String, String> createStringKeyValueMap()
{
Random rand = new Random();
HashMap<String, String> keyValues = new HashMap<String, String>();
for( int i = 0; i < 200; i++ )
{
int random = rand.nextInt(1324);
String key = "K"+Integer.toString( i );
String value = "V"+Integer.toString( random);
keyValues.put(key, value);
}
return keyValues;
}
public static IPersistentMap<String, DataType<?>> createDataKeyValueMap()
{
Random rand = new Random();
IPersistentMap<String, DataType<?>> keyValues = PersistentHashMap.EMPTY;
for( int i = 0; i < 200; i++ )
{
double random = rand.nextDouble();
String key = "K"+Integer.toString( i );
DataTypeBigDecimal value = new DataTypeBigDecimal( random );
keyValues = keyValues.assoc(key, value);
}
return keyValues;
}
public static void testPerformance(int inIterations ) throws InvalidProtocolBufferException
{
String t;
long startTime = System.nanoTime();
long initTime = 0;
long anchor = 0l;
long totalByteSize = 0;
for( int i = 0; i < inIterations; i++ )
{
long startInit = System.nanoTime();
IPersistentMap<String, DataType<?>> keyValues = createDataKeyValueMap();
// Message mess = PreMarshaller.createUpdateMessage(1, keyValues, true);
//
// initTime +=( System.nanoTime() - startInit );
//
// byte[] bytes = mess.toByteArray();
//
// totalByteSize += bytes.length;
//
// Message mess2 = Message.parseFrom(bytes);
//
// anchor += mess2.getUpdateMessage().getData().getBDEntries(0).getSerializedSize();
}
long endTime = System.nanoTime();
long time = endTime - startTime;
time-=initTime;
time /= 1000;
System.out.println(inIterations+" calculations took "+time+" us, anchor = "+anchor+" byteSize = "+(totalByteSize / inIterations));
time /= inIterations;
System.out.println("1 calculations took on average "+time+" us \n");
}
public static void main( String[] inArgs )
{
try
{
testPerformance(20000);
testPerformance(20000);
}
catch( Exception e )
{
e.printStackTrace();
}
// StringMap.Builder dataBuilder = StringMap.newBuilder();
// addStringValue( dataBuilder, "CCY1", "EUR" );
// addStringValue( dataBuilder, "CCY2", "SEK" );
//
// addBigDecimalValue( dataBuilder, "BID", new BigDecimal("0.01") );
// addBigDecimalValue( dataBuilder, "ASK", new BigDecimal("-0.0123") );
//
// builder.setDataMap( dataBuilder.build() );
// SubQueryMessage notice = builder.build();
//
// byte[] bytes = notice.toByteArray();
//
// try
// {
// notice = SubQueryMessage.parseFrom( bytes );
// System.out.println(notice.getType());
//
// for( int i = 0; i < notice.getDataMap().getStringEntriesCount(); i++ )
// {
// StringEntry entry = notice.getDataMap().getStringEntries(i);
//
// System.out.println( entry.getField()+" = "+entry.getData() );
// }
//
// for( int i = 0; i < notice.getDataMap().getBDEntriesCount(); i++ )
// {
// BigDecimalEntry entry = notice.getDataMap().getBDEntries(i);
//
// BigDecimal bd = new BigDecimal( new BigInteger( entry.getIntBytes().toByteArray() ), entry.getScale() );
// System.out.println( entry.getField()+" = "+bd );
// }
// }
// catch (InvalidProtocolBufferException e)
// {
// e.printStackTrace();
// }
}
public static void addStringValue( StringMap.Builder inData, String inField, String inValue )
{
StringEntry.Builder strEntryBuilder = StringEntry.newBuilder();
strEntryBuilder.setData( inValue );
strEntryBuilder.setField( inField );
inData.addStringEntries( strEntryBuilder.build() );
}
public static void addBigDecimalValue( DataMap.Builder inData, String inField, BigDecimal inValue )
{
BigDecimalEntry.Builder biBuilder = BigDecimalEntry.newBuilder();
biBuilder.setIntBytes( ByteString.copyFrom( inValue.unscaledValue().toByteArray()));
biBuilder.setScale( inValue.scale() );
biBuilder.setField( inField );
inData.addBDEntries( biBuilder.build() );
}
public static void addBooleanValue( DataMap.Builder inData, String inField, Boolean inValue )
{
BooleanEntry.Builder boolEntryBuilder = BooleanEntry.newBuilder();
boolEntryBuilder.setData( inValue );
boolEntryBuilder.setField( inField );
inData.addBoolEntries( boolEntryBuilder.build() );
}
public static void addNullValue( DataMap.Builder inData, String inField )
{
NullEntry.Builder nullEntryBuilder = NullEntry.newBuilder();
nullEntryBuilder.setField( inField );
inData.addNullEntries( nullEntryBuilder.build() );
}
public static void addHashMapValue( DataMap.Builder inData, String inField, DataMap inValue )
{
HashMapEntry.Builder hmBuilder = HashMapEntry.newBuilder();
hmBuilder.setData( inValue );
hmBuilder.setField( inField );
inData.addHashMapEntries( hmBuilder.build() );
}
}