Предположим, у меня есть следующие программы:Как раз, когда программа игнорирует время тратить на ожидание других потоков
public class ProgramA {
public void doSomething(ProgramC c) {
c.doSomething();
// Do something else that takes 5 seconds.
}
}
public class ProgramB {
public void doSomething(ProgramC c) {
c.doSomething();
// Do something else that takes 2 seconds.
}
}
public class ProgramC {
public synchronized void doSomething() {
// Do something that takes 10 seconds
}
}
Хочу времени программы А и программы В, чтобы выяснить, как долго они принимают (с помощью секундомера гуавы или аналогичный). Когда вы запускаете серийный номер, я получаю 15 и 12 секунд, как ожидалось. Однако при параллельном запуске я получаю, например, 15s и 22s, так как программа B проводит время, ожидая блокировки программы C.
Есть ли способ игнорировать время, потраченное на блокирование таким образом и получить те же тайминги, что и при запуске в последовательном режиме? Еще более полезным будет разбивка, например. «Программа B приняла 22s, из которых 10s блокировали на других потоках»
Так что вы хотите получить статистику по различным состояниям, в которых ваши потоки похожи, как часто ваши потоки блокируются или не работают? – NESPowerGlove
Я действительно хочу знать, когда программа пошла медленнее по причинам, не связанным с потоковой обработкой, например. если программа A начнет принимать 25 секунд, а не 15 секунд, я хотел бы знать, что дополнительные 10-ые из-за конфликтов потоков, а не регрессии производительности в другом месте программы. –
Вы можете профилировать свое приложение, а также просматривать состояния потоков с помощью visualvm. – NESPowerGlove