Когда я выполняю трассировку от одного Solaris M / C к другому, используя сетевой интерфейс 10 ГБ, это займет 0,073 мс для 40-байтовых пакетов.
Когда я делаю то же самое в Java, время намного дольше. Это длиннее даже после 10К итерации. Что может быть причиной ?
Java: отправитель (фрагмент)
Socket sendingSocket = new Socket(address, RECEIVER_PORT);
sendingSocket.setTcpNoDelay(true);
OutputStream outputStream = sendingSocket.getOutputStream();
byte[] msg = new byte[64]; // assume that it is populated.
for (int i = 0; i < 10000; i++) {
long start = System.nanoTime();
outputStream.write(msg,0,64);
outputStream.flush();
inputStream.read(msg,0,64); // inputStream is initialized like outputstream
long end = System.nanoTime();
}
Это занимает больше времени, чем 69 миллисекунд, и даже не зависит от размера байта. Даже если я уменьшу его до 1 байтового массива, он все равно займет 69 миллисекунд. Любой комментарий / предложение?
Другие наблюдения:
1. OutputStream.write и flush занимает всего 6 микросхем.
2. Точно так же на другой стороне TCPReceiver, которая получает и записывает обратно, это займет всего 6 микро.
Решение:
Спасибо всем, что вы ответили на этот запрос.
Я обнаружил, что это связано с размером буфера сокета:
Размер буфера по умолчанию установлен на Solaris M / C.
Размер полученного буфера 49152.
Размер буфера отправки 7552.
Я увеличил размер буфера сокета, и производительность почти совпадает с traceRoute.