Производительность put () в LinkedBlockingQueue - PullRequest
0 голосов
/ 23 января 2012

Я работаю над приложением для торговли акциями, чья функция key позволяет принимать данные из другой системы как можно быстрее (без блокировки). Затем мое приложение обработает данные позже.

Итак, я решил оставить очередь сообщений в 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 Ответ

1 голос
/ 23 января 2012

Обработайте 10000, а затем протестируйте на пакеты по 50 после того, как JVM нагреется.Для торговой системы вы должны убедиться, что JVM прогрелась до начала торговли.

Если вы хотите, чтобы ваша торговая система была стабильно быстрой, вы могли бы подумать, как это можно сделать, не выбрасывая никаких объектов.

Вам может быть интересна библиотека Disruptor.Он предназначен для обработки 5 М сообщений в секунду или более.http://code.google.com/p/disruptor/

...