Я работаю над эмпирическим анализом сортировки сортировки (сортировки строк) для школы, и я столкнулся с странным явлением, которое я не могу объяснить или найти объяснение. Когда я запускаю свой код, я фиксирую время выполнения, используя встроенный метод system.nanotime(), и по какой-то причине при определенном размере ввода, на самом деле принимает меньше времени для выполнения процедуры сортировки, чем с меньшим размером ввода ,Mergesort работает быстрее на больших входах
Моего алгоритм только основная сортировка слияния, и мой тестовый код прост тоже:
//Get current system time
long start = System.nanoTime();
//Perform mergesort procedure
a = q.sort(a);
//Calculate total elapsed sort time
long time = System.nanoTime()-start;
Выхода я за истекшее время при сортировке 900 строк были: 3928492ns Для 1300 строк это было: 3541923ns
С обоими из них в среднем около 20 испытаний, так что это довольно непротиворечиво. После 1300 строк время выполнения продолжает расти, как ожидалось. Я думаю, что может быть некоторый максимальный размер ввода, где это явление наиболее заметно.
Итак, мой вопрос: что может вызвать внезапное увеличение скорости программы? Я думал, что может быть какая-то оптимизация с массивами, содержащими большие объемы данных, хотя 1300 элементов в массиве вряд ли велики.
Некоторая информация:
- Компилятор: Java версии 1.7.0_07
- Алгоритм: Basic рекурсивная сортировка слиянием (с использованием массивов)
- Тип входа: Строки 6-10 символов, перемешиваются (в случайном порядке)
Я ничего не теряю?
Вы отсортировали сортировку по размерам по убыванию или по разным направлениям программы? – arynaq
* Я что-то пропустил? * Да, это не настоящий микро-тест. Пожалуйста, следуйте правилам, изложенным здесь: [Как написать правильный микро-тест в Java?] (Http://stackoverflow.com/q/504103/1065197). Обратите внимание, что после некоторых итераций вашего метода JIT будет запускаться, и производительность вашего кода будет оптимизирована, поэтому ваш код станет быстрее даже при обработке больших данных. –
Кстати, * компилятор * должен использоваться JDK. Eclipse - это только среда IDE и может работать с различными версиями JDK. –