Измерьте затраченное время ЦП для части кода в JAVA

В настоящее время я пытаюсь измерить реальное истекшее время процессора для части моего кода на java. Я читал это, чтобы получить процессорное время, вам нужно использовать

cpuTime = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();

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

long startTime = ManagementFactory.getThreadMXBean()
                        .getCurrentThreadCpuTime();
// reset with seed solution for each neighborRule and
// each pivoting rule
t.setCurrentBestSolution(seedSolution);
while (t.chooseNextImprovingNeighborSolution(pivotingRule,
                        neighborRule));                 
long endTime = ManagementFactory.getThreadMXBean()
                    .getCurrentThreadCpuTime();
if (endTime - startTime == 0) {
    System.err.println(pivotingRule + ":" + neighborRule);
    System.err.println("END TIME:" + endTime);
    System.err.println("START TIME:" + startTime);
                }

Любая идея ? Я неправильно использую часть CPUThread? Стоит ли использовать внешний тестер java?

заранее спасибо


person BodXav    schedule 04.04.2013    source источник
comment
Вы не можете точно измерить время выполнения более точно, чем нс. Вам нужно создать цикл или другой способ удлинить код, если вы хотите его протестировать.   -  person Denys Séguret    schedule 04.04.2013


Ответы (2)


Вам помогут методы класса System и Runtime. Взгляните на:

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Runtime.html.

Например: вы можете использовать: System.currentTimeMillis();, который возвращает время в миллисекундах до и после вашей программы! (в начале или в конце main метода!)

person boomz    schedule 04.04.2013
comment
Спасибо, но я не знаю, как среда выполнения или система могут дать мне процессорное время. - person BodXav; 04.04.2013

Стоит ли использовать внешний тестер java?

Да, пожалуйста. Jprofiler измеряет реальное прошедшее время среди других полезных показателей.

person Deepak Bala    schedule 04.04.2013
comment
JProfiler в основном используется для веб-приложений! Думаю, никто не использует его для console приложений. System и Runtime class могут помочь лучше. Что вы думаете? - person boomz; 04.04.2013
comment
Что натолкнуло вас на эту идею? Я все время использовал его для профилирования простых Java-приложений. Вам просто нужно правильно подключить агент при запуске виртуальной машины. - person Deepak Bala; 04.04.2013
comment
Я попробую посмотреть, работает ли JProfiler. Наличие 0 не так раздражает, но какова цель получения наносекундной точности, если вы не можете ее точно измерить. Спасибо за ответы - person BodXav; 04.04.2013
comment
Проблема в том, что nanoTime () не обеспечивает точности наноуровня. Только точность наноуровня. Разрешение обновления nanoTime () влияет на ваши результаты. Собственная DLL / SO должна иметь возможность обойти это, используя собственные часы высочайшей точности с лучшим разрешением обновления. Дайте нам знать, когда все будет готово. - person Deepak Bala; 04.04.2013