![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сравнение 2-х TFileStream
Unknown1 © (2012-11-16 11:16:00)Как быстро сравнить?
Игорь Шевченко (2012-11-16 15:48:00) [61]RWolf © (16.11.12 15:33) [19]
> читать в буфер можно ведь и мимо кэша, не?
Можно. Но надо исхитряться. По умолчанию работа с файлами выполняется с использованием кэша.
DVM (2012-11-16 15:45:00) [62]Если отображенные в память файлы сравнивать просто CompareMem, то немного быстрее поблочного чтения, примерно на 25%.
DVM (2012-11-16 15:42:00) [63]Сравнил я.
При размере буфера 64к скорости сравнялись. До 64к сравнение отображенных в память было быстрее, чем по блокам. Но тут надо учитывать, что сравнивать все равно придет поблочно читая из отображенных в память файлов, т.к. натравливать на них CompareMem не очень практично, т.к. при больших файлах этот процесс нельзя будет прервать и в реальной жизни так не удобно.
RWolf (2012-11-16 15:33:00) [64]
> Игорь Шевченко © (16.11.12 15:26) [17]
читать в буфер можно ведь и мимо кэша, не?
DVM (2012-11-16 15:31:00) [65]
> Игорь Шевченко © (16.11.12 15:26) [17]
> Первым делом при чтении в кэш она их отображает в память
> нужными определенными порциями.
Если я буду читать такими же примерно порциями? Сомневаюсь, что будет сильный выигрыш.
Легко поставить эксперимент, кстати. Сейчас проверю.
Игорь Шевченко (2012-11-16 15:26:00) [66]DVM © (16.11.12 15:14) [16]
Почитай, как Windows работает с файлами. Первым делом при чтении в кэш она их отображает в память нужными определенными порциями.
DVM (2012-11-16 15:14:00) [67]
> Игорь Шевченко © (16.11.12 15:11) [14]
Чтоб сравнить все равно потребуется чтение с диска, как б она с ним не работала.
DVM (2012-11-16 15:14:00) [68]С чего вдруг сравнение двух файлов отображенных в память будет выигрывать у сравнения двух файлов методом поблочного чтения? При отображении все равно будет такое же чтение с диска такими же блоками, волшебства тут не будет.
Игорь Шевченко (2012-11-16 15:11:00) [69]
> почему?
почитай как Windows работает с файлами
DVM (2012-11-16 15:11:00) [70]
> Можно и иначе, без TFileStream и без поблочного чтения.
> Отображаешь файлы (memory mapping, используются ф-и API)
> в память
Не все можно отобразить в память. Адресное пространстов 32 бит программ невелико по меркам современных жестких дисков и например два видеофайла туда не отобразить больших.
DVM (2012-11-16 15:09:00) [71]
class function TStreamHelper.CompareStreams(A, B: TStream;
BufferSize: Integer = DefStreamBufferSize): Boolean;
var
BufferA, BufferB: array of Byte;
ByteCountA, ByteCountB: Longint;
begin
SetLength(BufferA, BufferSize);
try
SetLength(BufferB, BufferSize);
try
repeat
ByteCountA := A.Read(BufferA[0], BufferSize);
ByteCountB := B.Read(BufferB[0], BufferSize);
Result := (ByteCountA = ByteCountB);
Result := Result and CompareMem(BufferA, BufferB, ByteCountA);
until (ByteCountA <> BufferSize) or (ByteCountB <> BufferSize) or not Result;
finally
SetLength(BufferB, 0);
end;
finally
SetLength(BufferA, 0);
end;
end;
AV (2012-11-16 15:01:00) [72]
> Игорь Шевченко © (16.11.12 13:52) [10]
почему?
Если файл большой, система скажет, что готово, отображено все. А потом, за кулисами, будет лазить в файл.
против
Зачитать в память все. Если не сбросит в своп - все в память.
Игорь Шевченко (2012-11-16 13:52:00) [73]RWolf © (16.11.12 13:41) [9]
Не выигрывает
RWolf (2012-11-16 13:41:00) [74]один мой знакомый, помнится, проводил бенчмарк на предмет быстрого подсчёта контрольной суммы больших файлов; у него получалось, что чтение в буфер выигрывает в плане скорости у отображения в память.
bems (2012-11-16 13:26:00) [75]С размером только на х32
А какие тут проблемы со скоростью?
QAZ9 (2012-11-16 12:50:00) [76]
> Можно и иначе
можно, но ненужно, ибо будут проблемы как со скоростью, так и с размером файлов
Dimka Maslov (2012-11-16 12:00:00) [77]MD5 высчитать для обоих файлов.
RWolf (2012-11-16 11:53:00) [78]
> Amoeba_ (16.11.12 11:51) [4]
можно, но условием задачи было сравнение 2-х TFileStream.
Amoeba_ (2012-11-16 11:51:00) [79]
> при совпадении прочитать данные поблочно да сравнить, а
> как ещё-то?
Можно и иначе, без TFileStream и без поблочного чтения. Отображаешь файлы (memory mapping, используются ф-и API) в память, и как для двух массивов байтов делаешь CompareMem.
AV (2012-11-16 11:46:00) [80]это первые 65536 байт только