如果我有一個C代碼回到以前的位置會比尋找新的位置快嗎?
off_t off = ftello(f);
fseeko(f, some_location);
// do some work
fseeko(off);
是第二fseeko作爲第一個那麼慢?我曾經認爲文件塊總是被緩存,所以第二個文件塊可以更快。
在我的Linux分析結果中,第二個fseek的成本相似。這是預期的嗎?
如果我有一個C代碼回到以前的位置會比尋找新的位置快嗎?
off_t off = ftello(f);
fseeko(f, some_location);
// do some work
fseeko(off);
是第二fseeko作爲第一個那麼慢?我曾經認爲文件塊總是被緩存,所以第二個文件塊可以更快。
在我的Linux分析結果中,第二個fseek的成本相似。這是預期的嗎?
第二個fseeko是否和第一個一樣慢?
它可以。
您會看到關於緩存保留的說法,但僅限於處理FS塊大小倍數的情況。因爲「fseeko()函數分別與fseek(3)(請參閱fseek(3))相同,除了fseeko()。」的偏移參數爲「as」之外,我建議閱讀更多How is fseek() implemented in the filesystem?, ref建議。
在大多數實現中,fseek
調用幾乎是空閒的,因爲它所做的全部都是在FILE
對象中設置位置。實際讀取數據時會產生成本。此時,重新讀取已讀取的塊很可能會受益於緩衝區緩存。但是,操作系統也很有可能進行推測式預讀,以使最近讀取的塊之後的塊也在緩衝區緩存中(第二次查找時可能會出現這種情況)。
對於寫入,測量時間更加複雜,因爲寫入的塊不一定會立即提交到永久存儲;只要數據已被複制到緩衝區緩存中,系統調用就會返回write
。
這不是尋求更快,但最終下一個IOs ... –
是 - 如果它不是更加令人驚訝 – 4386427