![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Не.Все будет нормально.Просто так как это блочное шифрование,то сделанно так,что последние байты дополняются нулями до кратности.А при расшифровки эти нули убираются.
|