![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сравнение по скорости [D6, Win2k]
wild_arg © (2004-08-25 09:10:00)Народ, как вы думаете, что будет быстрее работать?
AssignFile(f, FileName);
Reset (f, 16384);
BlockRead (F, PBuffer^, 1, dummy);
или
AssignFile(f, FileName);
Reset (f, 1);
BlockRead (F, PBuffer^, 16384, dummy);
Иными словами, что быстрее, прочитать один блок размером 16K или 16K блоков по 1 байту?
Wild Sam (2004-08-26 00:52:00) [1]Классный ответ, han-malign, спасибо!
han_malign (2004-08-25 10:03:00) [2]> Иными словами, что быстрее, прочитать один блок размером 16K или 16K блоков по 1 байту?
- в данном случае, и в том и в другом варианте, читается "один блок размером 16К"... А размер "записи" никаким боком к размеру блока не лежит.
function _BlockRead(var f: TFileRec; buffer: Pointer; recCnt: Longint; var recsRead: Longint): Longint;
begin
Result := BlockIO(f, buffer, recCnt, recsRead, fmInput,
{$IFDEF MSWINDOWS} ReadFileX, {$ENDIF}
{$IFDEF LINUX} __read, {$ENDIF}
100);
end;
function BlockIO(var f: TFileRec; buffer: Pointer; recCnt: Cardinal; var recsDone: Longint;
ModeMask: Integer; IOProc: TIOProc; ErrorNo: Integer): Cardinal;
// Note: RecsDone ptr can be nil!
begin
if (f.Mode and ModeMask) = ModeMask then // fmOutput or fmInOut / fmInput or fmInOut
begin
{$IFDEF LINUX}
Result := IOProc(f.Handle, buffer, recCnt * f.RecSize);
if Integer(Result) = -1 then
{$ENDIF}
{$IFDEF MSWINDOWS}
if IOProc(f.Handle, buffer, recCnt * f.RecSize, Result, nil) = 0 then
{$ENDIF}
.............
.............
function ReadFileX(hFile: Integer; Buffer: Pointer; nNumberOfBytesToRead: Cardinal;
var lpNumberOfBytesRead: Cardinal; lpOverlapped: Pointer): Integer; stdcall;
external kernel name 'ReadFile';
function __read(Handle: Integer; Buffer: Pointer; Count: Cardinal): Cardinal; cdecl;
external libc name 'read';
КаПиБаРа (2004-08-25 09:13:00) [3]И к бабке не надо ходить... конечно один блок размером 16K.