最近在优化软件运行速度,翻查C++代码的时候,发现了这么一处函数。功能很简单,就是比较内存值是否相同。
函数如下:
int cfunc_memcmp(char* src, char* dest, int n)
{
while (n--)
if (*src++ != *dest++)
return 1;
return 0;
}
看起来,这是一个很简单的函数,程序逻辑也很简短,似乎并没有什么可以优化的地方。
然而,对于这样一个简单的功能,在C Runtime库里,却有一个函数可以直接调用,效果完全相同。 代码如下:
#include
int cruntime_memcmp(void *src, void *dest, int n)
{
return memcmp(src, dest, n);
}
如果将函数cfunc_memcmp替换成cruntime_memcmp,速度会变化多少呢? 我们写一个简单的计时程序测试一下。 代码如下:
#include
#include
#include
int cruntime_memcmp(void *src, void *dest, int n)
{
return memcmp(src, dest, n);
}
int cfunc_memcmp(char* src, char* dest, int n)
{
while (n--)
if (*src++ != *dest++)
return 1;
return 0;
}
int main()
{
#define SIZE_BUF 1000000000
char *buf1 = new char[SIZE_BUF];
char *buf2 = new char[SIZE_BUF];
memset(buf1, 123, SIZE_BUF);
memset(buf2, 123, SIZE_BUF);
buf2[SIZE_BUF - 1] = (char)321;
clock_t start, end;
int nRet;
start = clock();
nRet = cfunc_memcmp(buf1, buf2, SIZE_BUF);
end = clock();
printf("The time clock was : %d \n", (end - start));
start = clock();
nRet = cruntime_memcmp(buf1, buf2, SIZE_BUF);
end = clock();
printf("The time clock was :%d \n", (end - start));
delete buf1;
delete buf2;
return 0;
}
输出结果为:
The time clock was : 435 The time clock was : 136
可以看到,两者之间速度相差有3倍之多。如果在大循环的内部,调用了这个函数,那么程序总体耗时就有明显的差异了。
为了充分研究memcmp为什么这么高效的原因,我们尝试直接编写汇编代码,去比较一下速度。
第一个版本,使用repz cmpsb指令,可以按字节比较内存 代码如下: