Фоновая информация
Недавно я подал заявку на мой класс по алгоритмам и структурам данных. Задача заключалась в том, чтобы реализовать решение для поиска максимального субарама произвольно сгенерированных массивов. Нам было предложено реализовать как алгоритм грубой силы, так и алгоритм рекурсивного деления и покорения.
Затем нас попросили проанализировать время работы, чтобы увидеть, при каком размере проблемы алгоритм грубой силы будет быстрее, чем рекурсивное решение. Это было сделано путем измерения времени работы (с использованием измерений System.nanoTime()) обоих алгоритмов для увеличения размеров проблем.
Однако определение этого оказалось немного сложнее, чем я ожидал.
Любопытство
Если я начну с запуска обоих алгоритмов с размерами проблем 5000, более чем в 10 раз, время работы для рекурсивного алгоритма падает с одного прогона на следующий примерно в 10 (от ~ 1800 мкс для выполнения, до ~ 200μS для выполнения), и он остается намного быстрее для остальных итераций. См. Рисунок ниже для примера
2-й и 3-й столбцы - это просто подтверждение того, что оба алгоритма вернут правильный максимальный субарейр
Это было протестировано на OS X 10.7.3 с Java 1.6.0_29 - результаты были одинаковыми при выполнении на ПК под управлением Windows 7 и Java 1.6 (точный номер версии неизвестен).
Исходный код программы можно найти здесь: https://gist.github.com/2274983
Мой вопрос таков: Что заставляет алгоритм внезапно выполнять это намного лучше после "разогрева"?