/*********************************************************************
* Author : Samson
* Date : 07/04/2012
* Test platform:
* GNU Linux version 2.6.29.4
* gcc version 4.4.0 20090506 (Red Hat 4.4.0-4) (GCC)
* *******************************************************************/
我們經常會自己實現寫一些系統函數, 但是不一定是效能最優的,那麼如何達到速度最快呢? 現就將附帶例子進行關於利用硬體特性或叫系統特性來進行記憶體拷貝的程式的最佳化。
如下代碼是沒有最佳化的普通的效能的函數:
#include <stdlib.h>
#include <stdio.h>
void *_memcpy(void *dest, const void *src, size_t n)
{
char i;
char *Pdest = (char *)dest, *Psrc = (char *)src;
for(i = 0; i < n; i++)
{
*Pdest = *Psrc;
Pdest += 1;
Psrc += 1;
}
return dest;
}
int main()
{
char strname[20] = "samson.wen";
char strcountry[20] = "China";
_memcpy(strcountry, strname, 8);
printf ("strcountry now value is %s\n", strcountry);
return 0;
}
編譯運行後的結果是:
[root@UFO testascii]# ./a.out
strcountry now value is samson.w
那麼面對以上的程式如何來做最佳化呢? 就利用一下系統的字長來做做最佳化吧, 我所使用的系統的字長為32位,也就是說一條指令的最大長度,那麼就專門針對size_t n這個參數能夠被4整除的數來修改成如下:
void *_memcpy(void *dest, const void *src, size_t n)
{
char i;
int num = n / sizeof(int);
int *Pdest = (int *)dest, *Psrc = (int *)src;
for(i = 0; i < num; i++)
{
*Pdest = *Psrc;
Pdest += 1;
Psrc += 1;
}
return dest;
}
其中, i改為char型,可以節省三個位元組, 然後在每次記憶體複製的時候是按字長(一般系統的int型的長度即是一個字長)來進行複製,這會大大節約系統調用的調用次數,相應的時間也就用的更少了,也就達到了最佳化的效果,這種效果尤其是在嵌入式系統中的時候。
你還有更好的最佳化方法嗎??? 若有,還請不吝賜教。