爲什麼這樣寫:readline()

這裏就不貼代碼了。代碼來自《UNIX 網絡編程》第一卷(3rd edition)P73,P75

具體來看看爲什麼要這樣寫。

這是兩個函數:P73的readline() Version 1;P75的readline() Version 2。

readline() Version 1

P73
代碼都是普通的C語言代碼,關鍵是作者這樣寫的思路是啥,爲什麼要這樣寫但是後來卻把這個版本的代碼給升級了。
而且還說這個版本的代碼是“及其慢的”
對於這個版本的代碼,想象一下,假設你要讀取64字節的文本,在for循環裏面:rc = read( fd, &c, 1),意味着每讀取一個字節過後都要再次調用系統調用read重新讀取下一個字節。直到讀取完成總共要進行64次系統調用過程。這是恐怖的。當數據量上升時,系統性能肯定會大幅下降。然後: *ptr++ = c,很顯然就是把讀到了每一個字節放到緩衝區裏面。

readline() Version 2

P75
第二個版本進行了升級,解決了那個頻繁調用read系統調用的問題。
怎麼解決的?這個就在另外一個函數:my_read實現的了。
關於函數my_read()這裏使用了一個控制變量read_cnt,控制什麼?怎麼控制的?控制的就是頻繁調用read。怎麼控制?第一條語句if( read_cnt <= 0 )說明了當my_read函數的內部緩衝區中得數據被readline讀取完了才進行read系統調用。
代碼:
     read_cnt--;
     *ptr = *read_ptr++;//每次讀取一個字符,轉移一個字符  
     return(1); 
要讀取的字節數減少1,然後,每次從內部緩衝區read_buf讀取一個字節,複製到readline的緩衝區,
達到的效果是每次讀取一個字節,而且避免了頻繁地系統調用


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章