Я работаю над приложением для торговли акциями, чья функция 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.