我正在开发一个股票交易应用程序,其密钥功能是尽可能快地接受来自另一个系统的一些数据(不阻塞)。然后我的应用程序将在稍后处理数据。
所以我应该让消息在LinkedBlockingQueue / LinkedTransferQueue中排队,然后定期排空队列并在后台线程中处理数据。
这就是:
private final LinkedTransferQueue<Data> queue = new LinkedTransferQueue<Data>();
public void store( int index, long time, String[] data ) throws InterruptedException{
Data data = new Data( index, time, data );
queue.put( data );
}
private class BackgroundProcessor implements Runnable{
private List<Data> entryList = new LinkedList<Data>( );
@Override
public void run(){
try {
while ( keepProcessing ){
int count = queue.drainTo( entryList );
for ( Data data : entryList ){
//process data
}
}
} catch( Exception e ){
logger.error("Exception while processing data.", e);
}
}
}
然后我想测试这种方法的表现:
public void testStore( String[] dataArray ) throws InterruptedException{
int size = 100 * 1000;
long iTime = System.nanoTime();
for ( int i=0; i < size; i++ ){
store( i, System.nanoTime, dataArray );
}
long fTime = System.nanoTime();
System.err.println("Average Time (nanos): " + (fTime - iTime)/size;
float avgTimeInMicros = ((float) (fTime - iTime)/(size * 1000));
System.err.println("Average Time (micros): " + avgTimeInMicros);
}
我在testStore()中看到,如果size = 100,0000,我可以创建Data对象(它是一个不可变对象)并以0.8微秒的速度排队。但是,如果我将尺寸减小到50,则需要多达20微米。
我假设,jvm一段时间后优化了我的代码。 但是,在我的应用程序中,在一个突发中获取50个数据消息更加真实,有没有办法调整jvm(或我的代码)以1-2微秒入队,无论突发大小如何?
P.S我在jdk 1.6上尝试了这个测试,-mx == -ms 512m。
答案 0 :(得分:1)
处理10,000,然后在JVM预热后测试50的突发。对于交易系统,您可以确保在开始交易之前预热JVM。
如果您希望您的交易系统始终如一,您可以考虑如何在不丢弃任何对象的情况下完成交易。
您可能会发现Disruptor库很有趣。它旨在处理5 M /秒或更多的消息。 http://code.google.com/p/disruptor/