2011-10-22 8 views
5

Mam aplikację Java, która nie jest wystarczająco szybka, jak się spodziewałem. Zrobiłem wiele wyszukiwań, jak to poprawić, ale nie było to szczęście.Jak sprawdzić, ile czasu kosztuje kod "zsynchronizowany" w Javie?

Teraz przeglądam kod i stwierdzam, że w kodzie jest dużo słowa kluczowego synchronized. Zastanawiam się, czy zabrali zbyt wiele czasu na czekanie na zamki.

Czy istnieje narzędzie do sprawdzenia, ile czasu one kosztują? W ten sposób mogę znaleźć lepsze rozwiązanie, jeśli kosztują zbyt wiele czasu.

+2

Jeśli "synchronizacja" zostanie przeprowadzona przy większych blokach, niż jest to konieczne, może to prowadzić do zmniejszenia wydajności z powodu niepotrzebnego czekania. – Cratylus

+1

Czy wypróbowałeś jakieś narzędzia do profilowania? – xappymah

Odpowiedz

4

Zamierzałem zasugerować funkcję Monitor nici pod numerem jvisualvm i, podczas wyszukiwania ekranu, wpadłem na ten wpis: Detecting Thread Contentions. To o wiele lepsze niż tylko zrzut ekranu :).

Ale tutaj jest to w każdym razie: thread contention in jvisualvm (image credit: wspomniany blogu)

1

Dobry profiler może wskazać metody, które powodują powolność, ale mogą wcale nie być związane z synchronizacją. Również spojrzenie na stan wątków w profilerze może ujawnić, czy zbyt dużo czekania dzieje się z powodu synchronizacji. W każdym razie, jeśli słowo kluczowe zsynchronizowane nie jest używane bez uzasadnienia, usunięcie go ze względu na wydajność może być niepraktyczne.

+0

Jeśli 'sunchronizacja' nie jest potrzebna, doprowadzi to do utraty wydajności. Jeśli potrzebna jest' synchronizacja' i) należy to zrobić na odpowiednim poziomie szczegółowości ii) jeśli zostanie ona usunięta, nie będzie odwrotna od zamierzonej - będzie to bałagan – Cratylus

+0

user384706 Zgadzam się. PO musi zrozumieć, dlaczego kod jest zsynchronizowany, a następnie można podjąć odpowiednie środki zaradcze. –

1

Koszt synchronizacji jest zwykle niewielka. Problem polega zwykle na tym, co robisz w blokach synchronizacji. Upewnij się, że nie wykonujesz żadnej operacji we/wy (gniazda lub sieci), a w idealnym przypadku nie ma żadnych wywołań systemowych, a czas blokady będzie wynosił poniżej mikrosekundy dla prostych zadań.