在很多時候,我們都會使用的strcpy這個函數,我們跟蹤c語言庫的話,會發現它是用彙編寫的。按道理來說效率應該很高,但是我寫了幾個strcpy的函數測試了一下:
char *strcpy1(char *dest, const char *src)
{
int i = 0;
while (src[i])
dest[i++] = src[i];
dest[i] = '/0';
return dest;
}
這個是一般的做法,我想大家都能想到。
char *strcpy2(char *dest, const char *src)
{
char *p = dest;
while (*src)
*dest++ = *src++;
*dest = '/0';
return p;
}
strcpy2的優點是少了一個變數i,可以少一個運算。
char *strcpy3(char *dest, const char *src) {
const char *end = src;
while (*end)
end++;
memcpy(dest, src, end-src+1);
return dest;
}
這個是我自己寫的,也是要推薦了,要知道mencpy的效率要比按位元組拷貝快的多的多。
下面我們用代碼來測試一下效率:
#include <malloc.h>
#include <STRING.h>
#include <windows.H>
#include <STDIO.H>
void main()
{
long nSize = 200;
char* pSource = (char *)malloc(nSize+1);
char* pDest = (char *)malloc(nSize+1);
memset(pSource, 'a', nSize);
pSource[nSize] = '/0';
DWORD dwStart = GetTickCount();
for(int i=0; i<5000000; i++)
{
strcpy(pDest, pSource);
}
DWORD dwEnd = GetTickCount();
printf("%d", dwEnd-dwStart);
}
我們分兩塊測試,第一塊是小段字串拷貝,如上面的200個位元組。然後我們測試一下10M位元組的,當然迴圈次數只用100次就夠了。
release下測試結果如下:
函數 20位元組 200位元組 10M
strcpy 3734 1734 2265
strcpy1 2015 1391 4219
strcpy2 1953 1453 3937
strcpy3 2422 984 1890
所以說c標準庫的不一定是最快的。
最後請大家在debug下跑一下看看,你會有新的驚喜,反正我還沒有搞清楚是為什麼。