Как узнать, сколько времени стоит «синхронизированный» код в Java? - PullRequest
5 голосов
/ 22 октября 2011

У меня Java-приложение, которое недостаточно быстрое, как я ожидал. Я много раз искал, как его улучшить, но не повезло.

Сейчас я проверяю код и обнаружил, что в коде много ключевых слов synchronized. Я думаю, если бы они слишком долго ждали замки.

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

Ответы [ 3 ]

4 голосов
/ 22 октября 2011

Я собирался предложить функцию Монитора потоков jvisualvm и, ища снимок экрана, наткнулся на этот пост: Определение несоответствий потоков .Это намного лучше, чем просто скриншот:).

Но в любом случае это так: thread contention in jvisualvm (изображение предоставлено вышеупомянутым сообщением в блоге)

1 голос
/ 22 октября 2011

Стоимость синхронизации обычно невелика. Проблема обычно в том, что вы делаете в блоках синхронизации. Убедитесь, что вы не выполняете никаких операций ввода-вывода (сокета или сети) и, в идеале, никаких системных вызовов вообще, а время блокировки для простых задач будет меньше микросекунды.

1 голос
/ 22 октября 2011

Хороший профилировщик сможет точно определить методы, которые вызывают медлительность, это может вообще не быть связано с синхронизацией.Кроме того, просмотр состояния потоков в профилировщике может показать, не слишком ли много ожиданий из-за синхронизации.В любом случае, если синхронизированное ключевое слово не используется без причины, его удаление может быть неэффективным для повышения производительности.

...