專利名稱:一種效率提高的內(nèi)存復(fù)制方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種計算機系統(tǒng)開發(fā)方法,尤其涉及一種效率提高的內(nèi)存復(fù)制方法。
背景技術(shù):
內(nèi)存復(fù)制函數(shù)(memcpy函數(shù))是計算機系統(tǒng)開發(fā)過程中最常用、也是最重要的庫函數(shù)之一,memcpy函數(shù)的實現(xiàn)與平臺有關(guān),一般都要盡可能提高該函數(shù)的性能,其效率直接影響到計算機系統(tǒng)的性能。memcpy 函數(shù)的原型是 void*memcpy (void*dest, void*src, int count),該函數(shù)實現(xiàn)的功能是將以src指向地址為起始地址的連續(xù)count個字節(jié)數(shù)據(jù)復(fù)制到以dest指向地址為起始地址的空間內(nèi)。以下是memcpy函數(shù)實現(xiàn)的一種典型方法
void * memcpy(void * dest,const void *src,size_t count)
{
char *tmp, *s;tmp = (char *)dest;s = (char*)src;while (count—)
* Imp 十十=
return dest;
}由上可見,完成一個字節(jié)復(fù)制需要以下步驟(I)檢查count是否為0,如果為O則函數(shù)返回,否則繼續(xù);(2)把src指針指向的地址中的數(shù)據(jù)復(fù)制到tmp指針指向的地址;(3) tmp 指針加 I;(4) src 指針加 I;(5) count 減 I ;(6)跳轉(zhuǎn)到步驟(I)。通過分析發(fā)現(xiàn),CPU復(fù)制一個字節(jié)需要經(jīng)過多個指令周期,尤其是在有跳轉(zhuǎn)指令的情況下,CPU指令流水線被頻繁打斷,極大的降低了 CPU執(zhí)行效率。上述方法是memcpy函數(shù)實現(xiàn)的最簡單方法之一,實際應(yīng)用中可以通過判斷dest地址和src地址是否為2字節(jié)對齊或4字節(jié)對齊,CPU可以通過一條指令復(fù)制2個字節(jié)或4個字節(jié),這種方法只能針對特殊情況,且效率提高并不明顯。
發(fā)明內(nèi)容
發(fā)明目的為了克服現(xiàn)有技術(shù)中存在的不足,本發(fā)明提供一種效率提高的內(nèi)存復(fù)制方法,使CPU進(jìn)行大塊內(nèi)存復(fù)制操作時大幅提高效率。
技術(shù)方案為實現(xiàn)上述目的,本發(fā)明采用的技術(shù)方案為一種效率提高的內(nèi)存復(fù)制方法包括如下步驟(I)判斷 count 是否大于 N,N > I ;
(2)若步驟(I)的判斷為是,則按次序?qū)⑦B續(xù)的N個字節(jié)數(shù)據(jù)從s指針指向的地址復(fù)制到tmp指針指向的地址,count=count_N、s=s+N、tmp=tmp+N,返回步驟(I);(3)若步驟(I)的判斷為否,則逐字節(jié)將數(shù)據(jù)從s指針指向的地址復(fù)制到tmp指針指向的地址。優(yōu)選的,N=16。由上述步驟可見,CPU復(fù)制大于等于16個字節(jié)數(shù)據(jù)的時候,首先判斷count是否大于16 :若判斷為是,則按次序?qū)?6個字節(jié)數(shù)據(jù)從s指針指向的地址復(fù)制到tmp指針指向的地址,最后將count減16、s加16,、tmp加16 ;若判斷為否,則將小于等于16個字節(jié)數(shù)據(jù)按照通常的方法逐字節(jié)進(jìn)行復(fù)制。綜上所述,在復(fù)制大量數(shù)據(jù)塊時,CPU平均復(fù)制每個字節(jié)所耗的時間大幅減少,同時不會頻繁使用跳轉(zhuǎn)指令;經(jīng)測試,復(fù)制少量字節(jié)的性能略有降低(幾乎可以忽略,因為只執(zhí)行了一個判斷語句),而復(fù)制大塊內(nèi)存數(shù)據(jù)時效率可提高50%以上,節(jié)省了 CPU開銷,提高了復(fù)制大塊內(nèi)存數(shù)據(jù)的效率。有益效果本發(fā)明提供的效率提高的內(nèi)存復(fù)制方法,在復(fù)制大量數(shù)據(jù)塊時,CPU平均復(fù)制每個字節(jié)所耗的時間大幅減少,同時不會頻繁使用跳轉(zhuǎn)指令,節(jié)省了 CPU開銷,提高了復(fù)制大塊內(nèi)存數(shù)據(jù)的效率。
圖I為本發(fā)明方法的流程圖。
具體實施例方式下面結(jié)合附圖對本發(fā)明作更進(jìn)一步的說明。如圖I所示為一種效率提高的內(nèi)存復(fù)制方法包括如下步驟(I)判斷count是否大于16 ;(2)若步驟(I)的判斷為是,則按次序?qū)⑦B續(xù)的16個字節(jié)數(shù)據(jù)從s指針指向的地址復(fù)制到tmp指針指向的地址,count=count_16、s=s+16、tmp=tmp+16,返回步驟(I);(3)若步驟(I)的判斷為否,則逐字節(jié)將數(shù)據(jù)從s指針指向的地址復(fù)制到tmp指針指向的地址。以下是根據(jù)上述方法給出的一種程序方案
4void * memcpy(void * dest,const void *src,size_t count)
i
char *tmp, *s; tmp = (char *)dest;s = (char*)src;for(;count>= 16;count-= 16)
{
tmp
= s
;tmp[l] = s[l];tmpP] = s[2];tmp[3] = s[3];tmp[4] = s[4];tmp[5] = s[5];tmp[6] = s[6];tmp[7] = s[7];tmP[8] = s[8];tmp[9] = s[9];tmp[10] = s[10];tmp[ll] = s[ll];tmp[12]-s[12];tmp[13] = s[13];tmp[14] = s[14];tmp[15] = s[15];
tmp 十=16;
s+=16;
}
while (count—)return dest;
j以上所述僅是本發(fā)明的優(yōu)選實施方式,應(yīng)當(dāng)指出對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視為本發(fā)明的保護(hù)范圍。
權(quán)利要求
1.一種效率提高的內(nèi)存復(fù)制方法其特征在于包括如下步驟(1)判斷count是否大于N,N > I ;(2)若步驟(I)的判斷為是,則按次序?qū)⑦B續(xù)的N個字節(jié)數(shù)據(jù)從s指針指向的地址復(fù)制到 tmp 指針指向的地址,count=count_N、s=s+N、tmp=tmp+N,返回步驟(I);(3)若步驟(I)的判斷為否,則逐字節(jié)將數(shù)據(jù)從s指針指向的地址復(fù)制到tmp指針指向的地址。
2.根據(jù)權(quán)利要求I所述的效率提高的內(nèi)存復(fù)制方法其特征在于所述N=16。
全文摘要
本發(fā)明公開了一種效率提高的內(nèi)存復(fù)制方法包括如下步驟(1)判斷count是否大于N,N>1;(2)若步驟(1)的判斷為是,則按次序?qū)⑦B續(xù)的N個字節(jié)數(shù)據(jù)從s指針指向的地址復(fù)制到tmp指針指向的地址,count=count-N、s=s+N、tmp=tmp+N,返回步驟(1);(3)若步驟(1)的判斷為否,則逐字節(jié)將數(shù)據(jù)從s指針指向的地址復(fù)制到tmp指針指向的地址。本發(fā)明提供的效率提高的內(nèi)存復(fù)制方法,在復(fù)制大量數(shù)據(jù)塊時,CPU平均復(fù)制每個字節(jié)所耗的時間大幅減少,同時不會頻繁使用跳轉(zhuǎn)指令,節(jié)省了CPU開銷,提高了復(fù)制大塊內(nèi)存數(shù)據(jù)的效率。
文檔編號G06F9/30GK102929579SQ20121039387
公開日2013年2月13日 申請日期2012年10月16日 優(yōu)先權(quán)日2012年10月16日
發(fā)明者姚艷松, 郭立煌, 周建波, 雍太利, 朱學(xué)海, 陳靖公, 王程謙 申請人:國電南京自動化股份有限公司