Я хотел бы обменять FILE * с HANDLE = CreateFile (), чтобы проверить разницу в скорости.
Я пытаюсь изменить свой код сейчас.
Может ли кто-нибудь сказать мне, как я должен изменить эти 2 строки, чтобы отразить, что я имею дело с дескриптором сейчас, а не с ФАЙЛОМ *?
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);
но что-то не правильно. Должно быть, я где-то ошибся.
Огромное спасибо за помощь!
Windows API эквивалент для fread
является ReadFile
и для fseek
является SetFilePointer
. Если вы просто замените эти вызовы, разница в производительности будет незначительной, если таковая имеется. В отличие от fseek
, SetFilePointer
поддерживает файлы> 2 ГБ. Если вам не нужно, что вызов просто:
SetFilePointer(myFile, iBytePos, NULL, FILE_BEGIN);
Вы можете ускорить дисковый ввод-вывод, используя Windows API, используя его большую гибкость. Если у вас много операций поиска-чтения-поиска-чтения, вы можете воспользоваться ReadFileScatter
вместо.
Другим потенциальным маршрутом для оптимизации было бы использование асинхронного ввода-вывода. Сравнение можно найти на Синхронный и асинхронный ввод-вывод.
За fseek
ты можешь использовать SetFilePointerEx
или же SetFilePointer
,
За fread
ты можешь использовать ReadFile
или же ReadFileEX
Вы можете найти помощь здесь
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365542(v=vs.85).aspx