Разница между временем пользователя потока и временем процессора в Java - PullRequest
2 голосов
/ 16 июня 2009

ThreadMXBean имеет два метода для извлечения времени использования потока:

В чем разница между этими двумя?


Обновление 2 : если я смогу связать с javadocs, пожалуйста не цитируйте их - я их уже прочитал.

Обновление : вот код, который я попытался использовать, чтобы узнать, что означают эти времена, с небольшим успехом:

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
threadMXBean.setThreadContentionMonitoringEnabled(true);
long mainThreadId = getMainThreadId(threadMXBean);

logTimes("Start", threadMXBean, mainThreadId);

URL url = new URL("https://hudson.dev.java.net");
URLConnection connection = url.openConnection();

connection.getContent();

logTimes("After loading", threadMXBean, mainThreadId);

и вывод:

Start Tue Jun 16 16:13:40 EEST 2009 Cpu time : 80, user time: 60, waited: 0, blocked: 0
After loading Tue Jun 16 16:13:43 EEST 2009 Cpu time : 1,020, user time: 960, waited: 0, blocked: 0

Таким образом, разница между процессором и временем пользователя увеличилась с 20 до 60 миллисекунд. Это потому, что использование HttpUrlConnection включает в себя некоторые сетевые операции ввода-вывода?

Ответы [ 2 ]

8 голосов
/ 16 июня 2009

Как уже упоминалось в документах по API, на которые вы ссылались,

getThreadCpuTime

Если реализация различает между временем пользовательского режима и режимом системы время, возвращаемое время процессора количество времени в потоке выполняется в пользовательском или системном режиме.

Если реализация JVM различает пользовательский режим и время режима ядра, результаты двух функций могут отличаться.

Кроме того, значение является точным только до наносекунды, и значение имеет проблему переполнения, если смещение> 2 ^ 63. JVM также должна поддерживать измерение времени процессора для текущего потока, и оно должно быть включено.

В Win32 возвращаемые значения должны быть такими же, как те, которые вы получаете из функции GetThreadTimes

getThreadUserTime() -> lpUserTime * 100 // или что-то в этом роде

getThreadCpuTime() -> (lpKernelTime + lpUserTime) * 100 // или что-то в этом роде

И более четкая ссылка на Режим пользователя против режима ядра

0 голосов
/ 16 июня 2009

Это объясняется в javadocs: -).

getThreadCpuTime: Возвращает общее время процессора для потока с указанным идентификатором.

getThreadUserTime: Возвращает процессорное время, которое поток с указанным идентификатором выполнил в пользовательском режиме.

Разница в том, что getThreadCpuTime также включает время, когда поток использовал процессор, но не находился в режиме пользователя. Это могут быть такие вещи, как нахождение в драйвере устройства, опрос ввода-вывода или тому подобное.

...