2011-06-14 49 views
1

我正在使用ReadFileEx(使用CreateFile和FILE_FLAG_NO_BUFFERING標誌打開)從文件中讀取扇區對齊的塊,記錄調用前的開始時間和完成例程中的結束時間(來自QueryPerformanceCounter的時間)。我可以準確地重疊ReadFileEx操作嗎?

無論整個文件的大小如何,我的塊讀取的大小都是恆定的。塊偏移按順序排隊,因此ReadFileEx總是讀取文件中比上一個更遠的點。我注意到一些奇怪的行爲,例如較小的文件記錄的塊讀取時間比較大的文件快得多。

在這種情況下,較大文件的大小是較小文件的兩倍 - 我不應該認爲這在原始數據讀取級別上很重要,因爲我正在讀取相同大小的塊。我看到的是文件報告160mb/s的較小文件,報告110mb/s的較大文件。

我仍然在假設它是我的代碼中的其他內容導致問題。我也希望ReadFileEx + GetLastError返回ERROR_IO_PENDING後,讀操作開始於某個操作系統定義點。

編輯:我的定時不準確性已通過調整我的讀取線程進一步確認,因此有更多時間在completionHandler通知的可警告狀態中等待。這增加了報告的讀取速度,表明我的問題的一部分是完成處理程序不會在讀取完成後立即調用(因此我的結束時間比應該晚)。但是,這樣做會大大提高報告的速度,同時爲更小或更小的文件提高比例。

TL; DR我的問題是,我可以用來衡量讀操作的實際時間,而不是和完成例程調用ReadFileEx(這可能無法啓動讀直線距離)之間的時間?

+0

只是澄清一下,你是否在不等待完成的情況下進行多個'ReadFileEx'調用,或者你是否爲每次完成都調用一次'ReadFileEx'調用?據我所知,沒有簡單的方法來計時實際閱讀。 – 2011-06-14 11:38:47

+0

@dauphic我正在做多個ReadFileEx調用,每次調用完成處理程序在未來的某個時刻完成讀取。 – badgerr 2011-06-14 11:53:47

+0

我不是100%,但我相信操作系統可能決定同時進行多個讀取。這可能會損壞大文件的讀取。我的經驗是,重疊讀取僅用於與處理最後一次讀取並行執行下一次讀取,而不是排隊多次讀取。 – 2011-06-14 12:03:58

回答

3

TL; DR我的問題是,我可以測量 讀操作的實際時間, 而不是時間調用 ReadFileEx(可能無法啓動 閱讀直線距離),並完成 程序之間?

可能不是用戶模式代碼。

控制範圍之外的變量太多。你不知道可能需要什麼尋求(例如,一個文件可能被分割,另一個可能不被分割)。文件映射(文件段到磁盤塊)可能已被緩存,也可能未被緩存。即使沒有讀取緩衝區,仍然存​​在集羣,驅動器搜索重新排序,驅動器緩存等。通過異步操作,您還可以使用調度程序進行操作。

使用驅動程序,您可以執行一些精確的測量,但仍需要運行大量實驗並計算平均值才能獲得統計結果,從而將驅動器內部發生的所有奇怪事情(重試,重新排序,使用備件,板載緩存,區位記錄,熱重新校準等)。

相關問題