Я тестировал производительность входного потока сокета чтения сервера. Я обнаружил, что само чтение имеет около 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
......
Как повысить производительность чтения? Клиент просто отправляет случайные значения двойной точки по запросу.
Спасибо,
Цель этого делает сервер очень отзывчив. Мне нужно прочитать и написать от клиента, который генерирует 1600 образцов с триггером 1 кГц. Затем каждый раз тик образца должен быть 0,001/1600 = 0,000625 мс (0,625 us). Итак, 9000 нс (9 us) - довольно большое значение. – user1098761
Я вижу. Удачи вам в оптимизации. – aioobe
@ user1098761 Это 1,5% пропускной способности. Это действительно большая ценность? – EJP