1

我想用 HANDLE=CreateFile() 交换 FILE* 来测试速度差异。

我现在正在尝试更改我的代码。

有人可以告诉我如何更改这两行以反映我现在正在处理句柄而不是 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

freadisReadFilefseekis的 Windows API 等效项SetFilePointer。如果您仅替换这些调用,则性能差异将很小(如果有的话)。相比之下fseekSetFilePointer支持大于 2GB 的文件。如果您不需要,调用很简单:

SetFilePointer(myFile, iBytePos, NULL, FILE_BEGIN);

您可以利用 Windows API 更大的灵活性来加速磁盘 I/O。如果您有很多 seek-read-seek-read 操作,您可能会受益于使用ReadFileScatter

另一个可能的优化途径是使用异步 I/O。可以在同步和异步 I/O中找到比较。

于 2013-10-12T13:48:24.923 回答
2

因为fseek您可以使用SetFilePointerExSetFilePointer

因为fread您可以使用ReadFileReadFileEX

你可以在这里找到帮助

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365542(v=vs.85).aspx

于 2013-10-12T13:28:16.797 回答