淘寶店:[吳健英的店]
for(;;)
{
void * buffer = malloc(SIZE);
memset(緩沖區(qū),大小);
進(jìn)程(緩沖區(qū))
自由緩沖區(qū);
}
這是一個(gè)實(shí)習(xí)生的偽代碼(我?guī)Я?0+個(gè)實(shí)習(xí)生,見(jiàn)多識(shí)廣)。本來(lái)這個(gè)SIZE很小,估計(jì)是用來(lái)存儲(chǔ)URL的,定義為512字節(jié)。后來(lái)因?yàn)槟撤N原因擴(kuò)展到1M,從512字節(jié)擴(kuò)展到1M,速度慢了很多。為什么?這位同學(xué)沒(méi)法解釋?zhuān)易屗^續(xù)探索,找出真正的原因。
我讓他從這些方面入手。
(1)首先對(duì)一些耗時(shí)的代碼進(jìn)行分析,發(fā)現(xiàn)memset從512到1M花費(fèi)的時(shí)間更多,且增加不是線性的。我讓他先看看glibc的memset源代碼,如下:
#如果定義了_LIBC ||定義了STDC_HEADERS ||定義了USG
#包括
#定義洪水記憶集
#否則
靜態(tài)空洪(__ptr_t,int,_ _ malloc _ size _ t);
靜態(tài)空隙
洪水(ptr、val、大小)
_ _ ptr _ t ptr
int val
_ _ malloc _ size _ t size
{
char * cp = ptr
while(大小-)
* cp++ = val;
}
#endif
可見(jiàn)memset是每個(gè)字節(jié)都賦值的,不是機(jī)器喜歡的方式。機(jī)器希望在4字節(jié)對(duì)齊的位置運(yùn)行(32位機(jī)器,64位機(jī)器喜歡8字節(jié)對(duì)齊),一次讀取32位(4字節(jié))。因此,memset可以實(shí)現(xiàn)一次寫(xiě)入4個(gè)字節(jié)的代碼。
(2) malloc需要進(jìn)一步探索。事實(shí)上,linux內(nèi)存分配有兩種,brk和mmap。前者分配128 K以?xún)?nèi)的內(nèi)存,后者分配128k以上的內(nèi)存,改成1M后,
void * buffer = malloc(SIZE);
這一段很快,因?yàn)橹环峙涮摂M內(nèi)存,不加載內(nèi)存??梢酝ㄟ^(guò)check /proc/pid/statm觀察操作前后內(nèi)存分配和memset的變化。
Memset需要實(shí)際內(nèi)存分配、頁(yè)面故障中斷、TLB加載等等。
brk分配的內(nèi)存是glibc管理的內(nèi)存,分配快,釋放方便(很多情況下不釋放)。所以brk分配用的是512字節(jié)(效率高),但是改成1M后,用的是mmap分配(memset效率低),所以效率低很多。
(3)如果將此代碼更改為,等效性能將大大提高。
void * buffer = malloc(SIZE);
for(;;)
{
memset(緩沖區(qū),大小);
進(jìn)程(緩沖區(qū))
}
自由緩沖區(qū);
(4)最后,需要質(zhì)疑的是為什么要開(kāi)一個(gè)1M大小的空房間,是否通過(guò)了驗(yàn)證,是否有必要這樣做,實(shí)際情況如何,是否需要memset,是否可以通過(guò)其他方法避免。
可見(jiàn),很多問(wèn)題,編碼習(xí)慣不好,對(duì)機(jī)器理解不足,在一般的工作中是很難發(fā)現(xiàn)的,必須體現(xiàn)在大規(guī)模數(shù)據(jù)處理的實(shí)際場(chǎng)合(處理的數(shù)據(jù)量足夠大)。所以大規(guī)模數(shù)據(jù)處理技術(shù)是軟硬件結(jié)合的技術(shù),不僅僅是技術(shù)問(wèn)題,還有業(yè)務(wù)問(wèn)題。應(yīng)該消除浪費(fèi)代碼和計(jì)算,不合理的計(jì)算應(yīng)該變得合理。
本文來(lái)源于網(wǎng)絡(luò)。如果原作者不支持我們轉(zhuǎn)發(fā),請(qǐng)聯(lián)系我們刪除。謝謝!
技術(shù)來(lái)自積累,成功來(lái)自堅(jiān)持
1.《memset 關(guān)于程序效率的問(wèn)題,你有思考過(guò)嗎?》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。
2.《memset 關(guān)于程序效率的問(wèn)題,你有思考過(guò)嗎?》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/junshi/889445.html