Сопоставимые измерения времени выполнения с циклами for в Java - PullRequest
0 голосов
/ 21 марта 2019

Я перебираю набор объектов в цикле for, и для каждого объекта один и тот же график генерируется в одной точке. Я случайно узнал, что генерация графика для первого объекта всегда имеет более длительное время выполнения по сравнению с другими.

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

Что это за оптимизация и можно ли ее отключить?

Редактировать: Вот сокращенный пример кода внутри цикла for:

double startTime = System.currentTimeMillis();
Graph g = new Graph();
for (int entry : entries) {
    graph.addVertex("v" + entry);
}
System.out.println("runtime: " + (System.currentTimeMillis() - startTime) / 1000.0);

Изменить: Вот измерения для первых нескольких циклов:

runtime: 0.045  
runtime: 0.001  
runtime: 0.001  
runtime: 0.002  
runtime: 0.002

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Я использовал -verbose:class, чтобы показать активность ClassLoader.В первой итерации есть много загруженных классов, которые после этого не загружаются снова.Как предложил @Juan, я просто отбрасываю первую итерацию сейчас как обходной путь.После этого все классы загружаются и каждая итерация выполняется в одинаковых условиях.

0 голосов
/ 24 марта 2019

Это может быть связано с оптимизацией C1 / C2. Запуск в коде интерпретатора отключит оптимизацию. Запустите с помощью -Xint. Обратите внимание, что работа в этом режиме повлияет на производительность всего приложения.

...