SetFilePointer
を検討してください。フォワードシークがシーケンシャルアクセスを構成するかどうかをMSDNのドキュメント(docs.microsoft.com
も)は説明していません。これはアプリケーションのIOパフォーマンスに影響します。あなたはFILE_FLAG_RANDOM_ACCESS
とCreateFile
を使用する場合読み取りよりも安価で、順次アクセス最適化のフォールスファウルを求めていますか?
たとえば、その後、Win32のはFILE_FLAG_SEQUENTIAL_SCAN
とは異なるバッファリングとキャッシング戦略を使用します - あなたが最初から最後までのファイルを読んでいるならば、あなたはランダムアクセスよりも優れたパフォーマンスを期待することができますオプション。
しかし、読み込んでいるファイルフォーマットが、ファイルのヘッダーのフラグが最初の100バイト - つまり100キロバイトを示すなど、すべてのバイト(またはバッファページ)をメモリに読み込む必要はないと仮定します。 - 有用なデータが含まれていません。 ReadFile
に次の100バイト(または100キロバイト以上)を読み込むことをお勧めしますか?SetFilePointer(file, 100, NULL, FILE_CURRENT)
を呼び出して100バイトをスキップするのはいつもより速いでしょうか?
SetFilePointer
を使用する方が一般的に高速な場合は、ランダムアクセスと順次オプションの違いがありますか?私は、現在キャッシュされているバッファ(およびOSがあなたのためにプリロードしているかもしれない将来のバッファ)を越えて前方を追求することができるので、前方を求めることはランダムアクセスの形になると思うだろうが、その場合Windowsは常に破棄するキャッシュされたバッファとディスクから再読み込み?バッファリロードをトリガーせずにシークできる最大量を見つける方法はありますか?
(私の仮説をテストするためにプロファイル作成とベンチマークを試みますが、私のコンピュータにはすべてNVMe SSDが搭載されています - 明らかにプラッタドライブでは非常に違いがあります)。
'SetFilePointer'は、[' FILE_OBJECT']( 'https://msdn.microsoft.com/en-us/library/windows/hardware/ff545834(v=vs/) 'の' CurrentByteOffset'にのみ設定されています。 85).aspx)をI/Oマネージャーから取得します。ファイルシステムも呼び出されません。この呼び出しは、ファイルオープンモード、ディスクなどとは独立しています+これは絶対無意味な呼び出しです。読み取りまたは書き込み操作で常に直接オフセットを渡すことができます – RbMm
あなたは間違った前提を設定しています: 'FILE_FLAG_RANDOM_ACCESS'も' FILE_FLAG_SEQUENTIAL_SCAN'も約束する。どちらも「ファイルキャッシュを最適化するためのヒントとして使用することができます」と記載されています。*何も実行しない場合や、最適化されたキャッシング戦略が一部のシステムで利用できない場合があります。 'SetFilePointer'がシーケンシャルアクセスを構成するかどうかにかかわらず、フラグが何もしないように準備する必要があります。 – IInspectable
*または最適化されたキャッシング戦略が一部のシステムで利用できない可能性があります。* - これはWindowsのソフトウェアの一部であり、すべてのWindowsバージョンで利用できます。 create fileの 'FILE_SEQUENTIAL_ONLY'と' FILE_RANDOM_ACCESS'オプションはファイルオブジェクトの 'FO_SEQUENTIAL_ONLY'と' FO_RANDOM_ACCESS'フラグに変換されます。それは先読み戦略のためにどのように使われたのですか?(具体的な実装はバージョンごとに変更されました)[こちら](https://github.com/Zer0Mem0ry/ntoskrnl/tree/master/Cache)を見ることができます。これらはすべて、 'SetFilePointer'と共通するものはありません。 – RbMm