2014-09-09 11 views
0

Наблюдая за вкладкой Sampler/CPU, под вкладкой Samples Samples, я вижу, что наиболее потребляющим методом является java.lang.Thread.sleepnative.Потребление процессора Thread.sleep()

У меня около 30 потоков с относительным вызовом sleep(). Но в чем смысл этого?

Мое среднее потребление процессора составляет 7%, действительно ли Thread.sleep() использует 70% этого времени?

Как это возможно, это «настоящее» потребление?

+0

Вы можете указать код своей темы? –

+1

Thread.sleep не является бесплатным, но если он показывает высокий процент времени (и вы не спите за 0 мс), это почти наверняка неправильно. Самое простое - игнорировать вызовы Thread.sleep вместе с большинством операций блокировки ОС, если речь идет о потреблении процессора. –

+0

Профилировщики пытаются оценить время, затрачиваемое, но по ряду причин оно никогда не бывает на 100% точным. Вы должны относиться к ним как к руководству, но также применять здравый смысл к результатам. –

ответ

6

Обычно сэмплер будет просто проверять каждый раз, что делает ваша программа, и сообщать вам, сколько раз (и простым умножением дает приблизительное количество времени) вашей программы внутри данного метода.

Это часто не имеет никакого отношения к реальной загрузке процессора.

Например, вызов sleep() приостанавливает поток, и, как таковой, процессор почти не загружается вашим кодом, но все же, если у меня есть программа, которая только запускается, спит в течение 10 минут и заканчивается, выборка говорит мне, что Thread.sleep потребляет 100% времени моего процессора.

То же самое относится к операциям ввода-вывода, в которых ваш поток сидит, ожидая, когда данные будут доставлены откуда-то (может быть удаленный интернет-хост или просто ваш диск), и не сильно загружает ЦП, но все же сэмплер (правильно) скажет вам, что большую часть времени проводилось внутри методов ввода-вывода, даже если сам процессор не делал так много.

+0

Итак, это потребление процессора, о котором сообщает сэмплер «поддельный» тоже? – mark

+3

Это не «подделка». Здесь ваша программа потратила время, что не означает, что за это время процессор был на 100%, это время может быть потрачено вашим приложением внутри данного метода, который ничего не делает на уровне ЦП. –

Смежные вопросы