2017-06-16 86 views
2

如果我有一個C代碼回到以前的位置會比尋找新的位置快嗎?

off_t off = ftello(f); 
fseeko(f, some_location); 
// do some work 
fseeko(off); 

是第二fseeko作爲第一個那麼慢?我曾經認爲文件塊總是被緩存,所以第二個文件塊可以更快。

在我的Linux分析結果中,第二個fseek的成本相似。這是預期的嗎?

+0

這不是尋求更快,但最終下一個IOs ... –

+0

是 - 如果它不是更加令人驚訝 – 4386427

回答

1

第二個fseeko是否和第一個一樣慢?

它可以。

您會看到關於緩存保留的說法,但僅限於處理FS塊大小倍數的情況。因爲「fseeko()函數分別與fseek(3)(請參閱fseek(3))相同,除了fseeko()。」的偏移參數爲「as」之外,我建議閱讀更多How is fseek() implemented in the filesystem?ref建議。

3

在大多數實現中,fseek調用幾乎是空閒的,因爲它所做的全部都是在FILE對象中設置位置。實際讀取數據時會產生成本。此時,重新讀取已讀取的塊很可能會受益於緩衝區緩存。但是,操作系統也很有可能進行推測式預讀,以使最近讀取的塊之後的塊也在緩衝區緩存中(第二次查找時可能會出現這種情況)。

對於寫入,測量時間更加複雜,因爲寫入的塊不一定會立即提交到永久存儲;只要數據已被複制到緩衝區緩存中,系統調用就會返回write