Linked()在LinkedBlockingQueue中的性能

时间:2012-01-23 15:29:20

标签: java multithreading performance queue put

我正在开发一个股票交易应用程序,其密钥功能是尽可能快地接受来自另一个系统的一些数据(不阻塞)。然后我的应用程序将在稍后处理数据。

所以我应该让消息在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。

1 个答案:

答案 0 :(得分:1)

处理10,000,然后在JVM预热后测试50的突发。对于交易系统,您可以确保在开始交易之前预热JVM。

如果您希望您的交易系统始终如一,您可以考虑如何在不丢弃任何对象的情况下完成交易。

您可能会发现Disruptor库很有趣。它旨在处理5 M /秒或更多的消息。 http://code.google.com/p/disruptor/