|
|
我是用纯C99来写一个字符串数组排序程序的,C99有个特性是可以指定函数内联以减小调用开销,程序中的关键语句如下:
#include <stdlib.h>
#include <string.h>
char* pStrs[1000000]; //里面全部存满了字符串(乱序)
qsort(pStrs,1000000,sizeof(char*),strcmp);
//现在pStrs有序了
在继续前,请先看一下这篇文章:
http://stl.winterxy.com/html/item_46.html
请注意其中的两段话:
-----------------------
因为comp是一个指向函数的指针,每次在sort中用到时,编译器产生一个间接函数调用——通过指针调用。大部分编译器不会试图去内联通过函数指针调用的函数,甚至,正如本例中,那个函数已经声明为inline而且这个优化看起来很直接。
把函数指针作为参数会抑制内联的事实解释了一个长期使用C的程序员经常发现却难以相信的现象:在速度上,C++的sort实际上总是使C的qsort感到窘迫。当然,C++有函数、实例化的类模板和看起来很有趣的operator()函数需要调用,而C只是进行简单的函数调用,但所有的C++“开销”都在编译期被吸收。在运行期,sort内联调用它的比较函数(假设比较函数已经被声明为inline而且它的函数体在编译期可以得到)而qsort通过一个指针调用它的比较函数。结果是sort运行得更快。在我的测试的一百万个double的vector上,它快670%,但不要光相信我的话,亲自试试。很容易证实当比较函数对象和真的函数作为算法的参数时,那是一个纯红利。
-----------------------
似乎是说在"strcmp"永远不可能内联调用,真是郁闷阿!
难道在这个排序字符串的简单问题上C始终要输给C++? :mad:
一个解决办法是自己重新定义一个str_sort函数,比如
void str_sort(char** pStr, size_t size);
将比较的过程嵌入函数内部,但是这样就完全没把握一定比标准库的qsort快,库里面的玩艺可是千锤百炼过的噢~
难道没有一方面利用库函数,另一方面又保证内联的办法么? :ask |
|