![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Var
f1,f2:file of longword;L:longword; begin assignfile(f1,'1.dat'); assignfile(f2,'2.dat'); reset(f1); reset(f2); for i:=1 to 1000000000000 do begin read(f1,L); L:=crypt(L,PASS); write(f2,L); end; closefile(f1); closefile(f2); функция crypt реализованна почти вся,за исключением двух строк,в асемблере. Pass Можно считать константой.Не в этом суть. Мне нужно ускорить этот процесс.Получается файл длинной 100мб шифруется минут 7 как минимум,мне надо гораздо быстрей. В функции ускорять нечего. Посмотрите пожалуйста,что можно ускорить в этом коде. Соответственно,в цикле 1000000000 я написал на бум,но там очень большое число :-) Заранее благодарен... |
#2
|
|||
|
|||
![]() Помарочка.Там где написанно reset(f2) должно быть rewrite(f2).Описался...
|
#3
|
||||
|
||||
![]() Попробуй использовать буферизацию, т.е. не считывать каждый раз по 1 Longword, а создать входной буфер на 10-100 кб и считывать из файла сразу по 10-100кб, затем шифровать все данные из буфера и полученный результат тоже записывать целикм.
Не профи, но и не чайник ![]() ![]() |
#4
|
|||
|
|||
![]() Хе-хе.А не напишешь код,как это реализовать? И реально будет ли разница в скорости?
|
#5
|
||||
|
||||
![]() Код:
function CryptFile(FileIn, FileOut : String) : Boolean; var fi, fo : file of Byte; Buffer : Pointer; i, BytesToRead : Integer; fiSize, fiPos : Longword; l : PLongword; const BufferSize = 51200; // 50kb begin {$I-} Result := False; try GetMem(Buffer, BufferSize); except Exit; end; AssignFile(fi, FileIn); AssignFile(fo, FileOut); Reset(fi); Rewrite(fo); fiSize := FileSize(fi); fiPos := 0; while fiPos < fiSize do begin if fiPos + BufferSize < fiSize then BytesToRead := BufferSize else BytesToRead := fiSize - fiPos; BlockRead(fi, Buffer^, BytesToRead); if IOResult <> 0 then Break; for i := 0 to (BytesToRead div 4) - 1 do begin l := PLongword(Longword(Buffer) + i * 4); l^ := crypt(l^, PASS); end; BlockWrite(fo, Buffer^, BytesToRead); if IOResult <> 0 then Break; fiPos := fiPos + BytesToRead; end; FreeMem(Buffer, BufferSize); CloseFile(fi); CloseFile(fo); Result := (fiPos = fiSize); {$I+} end; А насчет скорости.. Когда я писал прогу для поиска файлов по сигнатурам в больших файлах (файлы данных в играх и т.д.) прирост скорости был ОЧЕНЬ большой : без буферизации 400кб/с, с - 20~30мб/с. Не профи, но и не чайник ![]() ![]() Последний раз редактировалось zip000, 14.08.2007 в 17:35. |
#6
|
|||
|
|||
![]() Если не сложно,распиши пожалуйста каждый шаг.Хочется вникнуть в эту систему.Всегда пригодится. И еще... Никогда не вникал в типы начинающиеся с Р,типа Pchar.Это как указатели в С++? И нормально ли это будет работать если файл не кратен 50кб?
|
#7
|
||||
|
||||
![]() Сорри. Код немного неправильный был, уже поправил.
Цитата:
Код:
if fiPos + BufferSize < fiSize then BytesToRead := BufferSize else BytesToRead := fiSize - fiPos; Цитата:
Ну в принципе все просто. Сначала создаем сам буфер Код:
GetMem(Buffer, BufferSize); Код:
BlockRead(fi, Buffer^, BytesToRead); if IOResult <> 0 then Break; Код:
for i := 0 to (BytesToRead div 4) - 1 do begin l := PLongword(Longword(Buffer) + i * 4); l^ := crypt(l^, PASS); end; Код:
BlockWrite(fo, Buffer^, BytesToRead); if IOResult <> 0 then Break; Не профи, но и не чайник ![]() ![]() Последний раз редактировалось zip000, 14.08.2007 в 17:35. |
#8
|
|||
|
|||
![]() Большое спасибо!!! Сейчас у меня нет возможности попробовать.Попробую через неделю.Оставь пожалуйста свое мыло тут и асю.Буду тебя спрашивать если что.Ок?
|
#9
|
||||
|
||||
![]() Не профи, но и не чайник ![]() ![]() |
#10
|
||||
|
||||
![]() На заметку : функция будет работать даж если размер файла не кратен 4, но последние 3,2 или 1 байт файла не будут шифроваться.
Не профи, но и не чайник ![]() ![]() |
#11
|
|||
|
|||
![]() Не.Все будет нормально.Просто так как это блочное шифрование,то сделанно так,что последние байты дополняются нулями до кратности.А при расшифровки эти нули убираются.
|