memcmp的性能分析

memcmp的性能分析

最近在优化软件运行速度,翻查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指令,可以按字节比较内存 代码如下:

相关推荐

【原】日本岛每年下沉多少? 未来日本岛真的会沉入海底吗?
西部数码vps怎么样
365bet官方投注网站

西部数码vps怎么样

07-24 👁️ 414
苹果手机有哪些直播软件推荐 苹果手机直播软件推荐
最大化触发特殊事件 马驹快速养成心得
bet·365官方网站

最大化触发特殊事件 马驹快速养成心得

07-22 👁️ 6500