я сделал быструю проверку здравомыслие, используя эту структуру (который имеет размер 576, когда int
является 32-битным)
struct test
{
int value;
char data[572];
};
Я инициализируется динамически выделенный массив 1 млн структур с этим кодом
for (int i = 0; i < count; i++)
{
array[i].value = rand();
for (int j = 0; j < 572; j++)
array[i].data[j] = rand();
}
И я отсортированный массив с этим кодом
int compare(const void *ptr1, const void *ptr2)
{
struct test *tptr1 = (struct test *)ptr1;
struct test *tptr2 = (struct test *)ptr2;
return tptr1->value - tptr2->value;
}
int main(void)
{
int count = 1000000;
...
qsort(array, count, sizeof(struct test), compare);
...
}
Время инициализации массива составляло 4,3 секунды, а время сортировки массива составляло 0,9 секунды.
Затем я модифицировал код для создания массива указателей на структуры и отсортировал массив указателей. Время инициализации было еще 4,3 секунды (большая часть времени инициализации вызвана вызовом rand()
500 миллионов раз). Сортировка массива указателей заняла 0,4 секунды. Сортировка массива указателей была более чем в два раза быстрее, чем сортировка массива структуры напрямую.
Итак, мой вывод состоит в том, что ваш код имеет некоторые массовые недостатки, которые не имеют никакого отношения к qsort
.
Вы должны измерить его, используя вызов 'time (3)' до и после того, как метод сортировки называется –
Возможно ли, что сортировка массива структур с qsort уже заменяет указатели, а не структуры? –
Также 5 секунд - разница 2.5%, которая может быть в пределах вашего погрешности. – jxh