Использование процессора Thread.sleep()

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

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

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

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


person Fede Rossi    schedule 09.09.2014    source источник
comment
можешь дать код своей темы?   -  person ug_    schedule 09.09.2014
comment
Thread.sleep не бесплатен, но если он показывает высокий процент времени (и вы не спите в течение 0 мс), это почти наверняка неправильно. Самое простое, что можно сделать, это игнорировать вызовы Thread.sleep вместе с большинством блокирующих операций ОС, если вас беспокоит потребление ЦП.   -  person Peter Lawrey    schedule 09.09.2014
comment
Профилировщики пытаются оценить, на что тратится время, но по ряду причин это никогда не бывает на 100% точным. Вы должны относиться к ним как к руководству, но также применять здравый смысл к результатам.   -  person Peter Lawrey    schedule 09.09.2014


Ответы (1)


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

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

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

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

person Simone Gianni    schedule 09.09.2014
comment
Итак, потребление процессора, о котором сообщает сэмплер, тоже подделка? - person mark; 09.09.2014
comment
Это не подделка.. это то место, где ваша программа провела время, что не означает, что в это время ЦП был загружен на 100%, это может быть время, потраченное вашим приложением внутри данного метода, который ничего не делает на уровне ЦП. - person Simone Gianni; 09.09.2014