У меня есть простой рекурсивный метод поиска в глубину. При каждом вызове он проверяет, находится ли он в листе, в противном случае он расширяет текущий узел и вызывает себя для дочерних элементов.
Я пытаюсь сделать это параллельно, но замечаю следующую странную (для меня) проблему.
Я измеряю время выполнения с помощью System.currentTimeMillis ().
Когда я разбиваю поиск на несколько подпоисков и добавляю общее время выполнения, я получаю большее число, чем последовательный поиск. Я измеряю только время выполнения, отсутствие связи или синхронизации и т. Д. Я ожидаю получить то же время, когда добавляю время подзадач. Это происходит, даже если я просто запускаю одну задачу за другой, то есть без потоков. Если я просто разбиваю поиск на несколько подзадач и запускаю подзадачи одну за другой, у меня больше времени.
Если я добавлю количество вызовов методов для подзадач, я получу тот же номер, что и при последовательном поиске. Итак, в основном, в обоих случаях я делаю одинаковое количество вызовов методов, но получаю разное время.
Я предполагаю, что некоторые начальные вызовы методов или что-то еще вызвано механизмом JVM. Есть идеи, что это может быть?
Например, один последовательный поиск занимает около 3300 мс. Если я разбью его на 13 задач, это займет 3500 мсек.
Мой метод выглядит так:
private static final int dfs(State state) {
method_calls++;
if(state.isLeaf()){
return 1;
}
State[] children = state.expand();
int result = 0;
for (int i = 0; i < children.length; i++) {
result += dfs(children[i]);
}
return result;
}
Всякий раз, когда я это называю, я делаю это так:
for(int i = 0; i < num_tasks; i++){
long start = System.currentTimeMillis();
dfs(tasks[i]);
totalTime += (System.currentTimeMillis() - start);
}
Проблема в том, что totalTime увеличивается с num_tasks, и я ожидаю, что он останется прежним, потому что переменная method_calls останется прежней.