Профиль Java параллельная / последовательная сортировка - PullRequest
0 голосов
/ 03 декабря 2010

Кто-нибудь знает хороший способ профилировать алгоритм сортировки в Java (последовательное и разветвленное соединение)?поскольку время выполнения слишком короткое (размер списка сортировки 5000 ..), System.nanoTime () не работает должным образом.

Я планирую много раз (1000) выполнить один и тот же тестовый набор и избавиться от первых 100результаты (избегайте проблем с компилятором HotSpot) и выполняйте среднее время выполнения с помощью System.nanoTime ().Любое предложение по этому поводу?

Большое спасибо!

Могу ли я сделать так?

double count = 0;
double start, end;
for(int r = 0; r < warmup; r++) {
    // do test
}
for(int t = 0; t < runs; t++){
    start = System.nanoTime();
    // do test
    end = System.nanoTime();
    count += start - end;
}
double avg = count/avg

Ответы [ 3 ]

2 голосов
/ 03 декабря 2010

Если время работы в реальном мире слишком мало для тестирования, вероятно, его не стоит оптимизировать.

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

1 голос
/ 03 декабря 2010

Я могу заверить вас, что nanoTime () работает, и если вы хотите избежать разогрева всех точек доступа, вам нужно запустить его 10K раз. Вы должны обнаружить, что элемент 5К довольно быстрый и даже тест 1К - это не очень много. Вам нужно написать тест, который дает воспроизводимые результаты. Если вы этого не сделали, вам нужно исправить тест, потому что он не очень хорош.

Я предлагаю вам попробовать и посмотреть, какие результаты вы получите.

На старом компьютере, что-то вроде 5K случайных значений int занимает около 500 долларов США. Примечание: сортировка отсортированного массива не даст того же результата. (поэтому вы не можете сортировать один и тот же массив каждый раз)

Простой способ запустить тест определенное количество раз, игнорируя первые N запусков, - это сделать.

long start = 0;
for(int r = -warmup; r < runs; r++) {
    if (r == 0) start = System.nanoTime();
    // do test
}
long avg = (System.nanoTime() - start)/runs;
1 голос
/ 03 декабря 2010

Начните с сортировки большего списка. Я бы сказал, что 50 000 000 элементов более разумно, если вы пытаетесь сравнить время тестирования.

...