qsort() performance issue
我成功地对一个结构数组进行排序,其中每个结构只包含一个char字符串。然而,我的问题是,对于一个大约900000个元素的结构数组,qsort所花费的时间比我预期的要长(qsort对这个数组进行排序大约需要2分钟);这让我觉得我忽略了一些东西。排序是我正在处理的任务中的一个微不足道的部分,并且独自一人完全超过了我对程序的时间限制。
以下是我的代码的相关部分:
1 2 3 4
| struct WordsArray //Just a struct thath holds a *char
{
char word[25];
}; |
传递到qsort的比较函数:
1 2 3 4 5 6 7 8 9 10 11
| int cmpfunc (const void *a , const void *b )
{
const struct WordsArray *a1 ;
a1 = (WordsArray *)malloc(sizeof(WordsArray ));
const struct WordsArray *b1 ;
b1 = (WordsArray *)malloc(sizeof(WordsArray ));
a1 = (struct WordsArray *)a ;
b1 = (struct WordsArray *)b ;
return strcmp(a1 ->word , b1 ->word );
} |
号
我打给qsort的电话:
1 2 3
| WordsArray *AllWordsArray ;
AllWordsList = (WordsArray *)malloc(sizeof(WordsArray )*ListSize );
qsort(AllWordsList ->word , ListSize , sizeof(struct WordsArray ), cmpfunc ); |
谢谢你的意见。
- 不要在比较函数中使用malloc!
- 你在比较器函数中分配内存。这是不必要的,减慢程序速度并导致内存泄漏,因为您从未释放它。看看比较器,把它修好。
问题在于您的cmpfunc的实现:它比消防栓更快地泄漏内存!
您分配(WordsArray*)指针只是为了在下一行上重写它们,从而在进程中造成内存泄漏。您只需删除EDOCX1[2]s:
1 2 3 4 5
| int cmpfunc (const void *a , const void *b ) {
const struct WordsArray *a1 = (struct WordsArray *)a ;
const struct WordsArray *b1 = (struct WordsArray *)b ;
return strcmp(a1 ->word , b1 ->word );
} |
- 为什么不直接将a和b转换成a1和b1(编译器可能会这样做)?返回strcmp(((const struct wordsarray*)a)->word,((const struct wordsarray*)b)->word);
- 不需要铸造。还是C!;-)
- @RCGLDR:"为什么不直接投射……":为了可读性,我怀疑。
- 非常感谢!我和CMFunc相处得很艰难,所以一旦我能得到一些有用的东西,我就和它一起跑了。至于演员阵容,我会试试的。