Мы провели профилирование и профилирование нашего приложения, чтобы как можно больше уменьшить задержку. Наше приложение состоит из 3 отдельных процессов Java, работающих на одном сервере, которые передают сообщения друг другу через сокеты TCP/IP.
Мы сократили время обработки в первом компоненте до 25 мкс, но мы видим, что запись сокета TCP/IP (на localhost) в следующий компонент неизменно занимает около 50 мкс. Мы видим еще одно аномальное поведение, заключающееся в том, что компонент, который принимает соединение, может писать быстрее (т.е. < 50 мкс). Прямо сейчас все компоненты работают < 100 мкс, за исключением связи сокета.
Не будучи экспертом по TCP/IP, я не знаю, что можно сделать, чтобы ускорить это. Разве Unix-доменные сокеты будут быстрее? MemoryMappedFiles? какие другие механизмы могли бы быть более быстрым способом передачи данных из одного Java-процесса в другой?
ОБНОВЛЕНИЕ 6/21/2011 Мы создали 2 тестовых приложения, один на Java и один на С++, чтобы более точно сравнивать TCP/IP и сравнивать. Приложение Java использовало NIO (режим блокировки), а С++ - библиотеку Boost ASIO tcp. Результаты были более или менее эквивалентными: приложение С++ примерно на 4 мкс быстрее, чем Java (но в одном из тестов Java beat С++). Кроме того, обе версии проявили большую изменчивость в течение времени на сообщение.
Я думаю, мы согласны с основным заключением, что реализация общей памяти будет самой быстрой. (Хотя мы также хотели бы оценить продукт Informatica, если он соответствует бюджету.)