JVM недетерминированные прошедшие времена - PullRequest
2 голосов
/ 15 октября 2011

Однопоточная программа, выполняющая цикл из 500 миллионов итераций, обычно занимает около 400 мс, а иногда и около 1200 мс на компьютере Linux с частотой 2,8 ГГц. Это наблюдается в программе, которая не делает ничего другого, кроме как измеряет прошедшее время цикла. Что объясняет эту изменчивость?

import java.io.PrintWriter;
import java.util.Date;

public class Tester
{
    public static void main(String[] args)
    {
        PrintWriter pw = new PrintWriter(System.out, true);

        Date d0 = new Date();
        long t0 = d0.getTime();

        for (long i = 0; i < 500000000; i++)
            ;

        Date d1 = new Date();
        long t1 = d1.getTime();

        pw.format("%d\n", t1 - t0);   
    }
}

1 Ответ

2 голосов
/ 15 октября 2011

Процедуры сбора мусора должны запускаться некоторое время, даже если у вас нет мусора для сбора.

Легко предположить, что, поскольку вы не выделяете или не разыменовываете память, вам не понадобитсясобирать мусор;однако подпрограмма сбора мусора выполняется в независимом потоке и не проверяет возможные потоки в вашем коде, чтобы определить, должен ли он выполняться.

Итак, подпрограмма сбора мусора запускается и не находит мусора для сбора.Это занимает некоторое время.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...