2012-03-26 12 views
1

Я тестировал производительность входного потока сокета чтения сервера. Я обнаружил, что само чтение имеет около 9000 нано-секундных (9 us) задержек. Как я могу улучшить свою производительность? Я пробовал размер буфера по умолчанию JAVA и немного больше этого. Но его производительность мало изменилась. В этом случае я подсчитал каждые 1600 выборок от клиента.Как улучшить производительность чтения сокетов?

Большая задержка находится в этой строке:

inputLine = in.readLine(); 

Вот код чтения нити:

PrintWriter out = new PrintWriter(door.getOutputStream(), true);    
BufferedReader in = new BufferedReader(new InputStreamReader(door.getInputStream()), 10240);   

File file = new File(this.storageDirectory); 
BufferedWriter save = new BufferedWriter(new FileWriter(file)); 

String inputLine = null; 

while(Switch) 
{ 
    inputLine = in.readLine(); //I found ~9000 ns delay in this line. 
    save.write(inputLine); 


    if(iCounter==0) 
     StartTime = System.nanoTime();     

    iCounter++;      


    if(iCounter>=1600) //need to store them. 
    { 
     EndTime = System.nanoTime(); 
     TimeTick = (EndTime - StartTime)/1600; 
     System.out.println("TimeTick is [ns]: " + TimeTick);      
     iCounter = 0; 
    } 
} 

Вот результат:

TimeTick is [ns]: 9241 
TimeTick is [ns]: 9941 
TimeTick is [ns]: 6535 
..... 

Вот результат без 'inputLine = in.readLine();'

TimeTick is [ns]: 0 
TimeTick is [ns]: 0 
TimeTick is [ns]: 1 
...... 

Как повысить производительность чтения? Клиент просто отправляет случайные значения двойной точки по запросу.

Спасибо,

ответ

1
String inputLine = null; 

while (...) { 
    ... 
    inputLine = in.readLine(); //I found ~9000 ns delay in this line. 
    save.write(inputLine); 
    ... 
} 

Если закомментировать строку для чтения, вы не будете иметь ничего писать, так что по сути вы закомментировать обе линии, нет?

Ваши микро-тесты (которые кажутся немного изворотливыми для начала), вероятно, откроют лучшую информацию, если у вас есть строка по умолчанию, которую save.write написал на каждой итерации.

Хороший и уместный вопрос и ответ:

+0

Цель этого делает сервер очень отзывчив. Мне нужно прочитать и написать от клиента, который генерирует 1600 образцов с триггером 1 кГц. Затем каждый раз тик образца должен быть 0,001/1600 = 0,000625 мс (0,625 us). Итак, 9000 нс (9 us) - довольно большое значение. – user1098761

+0

Я вижу. Удачи вам в оптимизации. – aioobe

+0

@ user1098761 Это 1,5% пропускной способности. Это действительно большая ценность? – EJP

Смежные вопросы