1

速度の違いをテストするために、FILE* を HANDLE=CreateFile() と交換したいと思います。

私は今自分のコードを変更しようとしています。

これらの 2 行を変更して、現在 FILE* ではなくハンドルを扱っていることを反映する方法を誰か教えてもらえますか?

fseek(myFile,iBytePos,SEEK_SET);
fread(&SomeValues[0],iByteCount,1,myFile);

私は試した

LARGE_INTEGER l;

l.QuadPart=iBytePos;
SetFilePointer(myFile,l.LowPart,&l.HighPart,FILE_BEGIN);

DWORD dw;
BOOL result = ReadFile(myFile,&SomeValues[0],iByteCount,&dw,NULL);

しかし、何かが正しくありません。どこかで道を間違えたに違いない。

助けてくれてどうもありがとう!

4

2 に答える 2

6

freadisReadFileおよび for fseekisに相当する Windows APIですSetFilePointer。これらの呼び出しを単に置き換えるだけでは、パフォーマンスの違いがあったとしてもごくわずかです。とは対照的にfseekSetFilePointerは 2 GB を超えるファイルをサポートします。必要がない場合は、次のように呼び出します。

SetFilePointer(myFile, iBytePos, NULL, FILE_BEGIN);

Windows API の優れた柔軟性を利用して、ディスク I/O を高速化できます。シーク - リード - シーク - リード操作が多い場合は、ReadFileScatter代わりに使用することでメリットが得られる可能性があります。

最適化のためのもう 1 つの潜在的な方法は、非同期 I/O を使用することです。同期および非同期 I/Oで比較を確認できます。

于 2013-10-12T13:48:24.923 に答える