Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Файловая система
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.08.2007, 14:19
DA54 DA54 вне форума
Прохожий
 
Регистрация: 13.05.2007
Сообщения: 37
Репутация: 10
По умолчанию Помогите оптимизировать(ускорить)

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  
Старый 14.08.2007, 14:23
DA54 DA54 вне форума
Прохожий
 
Регистрация: 13.05.2007
Сообщения: 37
Репутация: 10
По умолчанию

Помарочка.Там где написанно reset(f2) должно быть rewrite(f2).Описался...
Ответить с цитированием
  #3  
Старый 14.08.2007, 14:29
Аватар для zip000
zip000 zip000 вне форума
Начинающий
 
Регистрация: 24.07.2007
Сообщения: 194
Репутация: 25
По умолчанию

Попробуй использовать буферизацию, т.е. не считывать каждый раз по 1 Longword, а создать входной буфер на 10-100 кб и считывать из файла сразу по 10-100кб, затем шифровать все данные из буфера и полученный результат тоже записывать целикм.
__________________
Не профи, но и не чайник . D6 - лучше не придумали. Пока.
Ответить с цитированием
  #4  
Старый 14.08.2007, 15:18
DA54 DA54 вне форума
Прохожий
 
Регистрация: 13.05.2007
Сообщения: 37
Репутация: 10
По умолчанию

Хе-хе.А не напишешь код,как это реализовать? И реально будет ли разница в скорости?
Ответить с цитированием
  #5  
Старый 14.08.2007, 15:56
Аватар для zip000
zip000 zip000 вне форума
Начинающий
 
Регистрация: 24.07.2007
Сообщения: 194
Репутация: 25
По умолчанию

Код:
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мб/с.
__________________
Не профи, но и не чайник . D6 - лучше не придумали. Пока.

Последний раз редактировалось zip000, 14.08.2007 в 17:35.
Ответить с цитированием
  #6  
Старый 14.08.2007, 16:17
DA54 DA54 вне форума
Прохожий
 
Регистрация: 13.05.2007
Сообщения: 37
Репутация: 10
По умолчанию

Если не сложно,распиши пожалуйста каждый шаг.Хочется вникнуть в эту систему.Всегда пригодится. И еще... Никогда не вникал в типы начинающиеся с Р,типа Pchar.Это как указатели в С++? И нормально ли это будет работать если файл не кратен 50кб?
Ответить с цитированием
  #7  
Старый 14.08.2007, 16:40
Аватар для zip000
zip000 zip000 вне форума
Начинающий
 
Регистрация: 24.07.2007
Сообщения: 194
Репутация: 25
По умолчанию

Сорри. Код немного неправильный был, уже поправил.
Цитата:
Сообщение от DA54
И нормально ли это будет работать если файл не кратен 50кб?
Файл может быть любого размера (только его размер должен быть кратен 4, т.к. ты используешь Longword), здесь
Код:
    if fiPos + BufferSize < fiSize then
      BytesToRead := BufferSize
    else
      BytesToRead := fiSize - fiPos;
специально вычисляется сколько байт осталось прочитать в файле. Также можешь поэкспериментировать с размером буфера, посмотреть в каком случае быстрее всего будет шифроваться файл (размер буфера тож должен быть кратен 4).

Цитата:
Сообщение от DA54
Никогда не вникал в типы начинающиеся с Р,типа Pchar.Это как указатели в С++?
Да, это они самые.

Ну в принципе все просто. Сначала создаем сам буфер
Код:
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;
Освобождаем ресурсы.
__________________
Не профи, но и не чайник . D6 - лучше не придумали. Пока.

Последний раз редактировалось zip000, 14.08.2007 в 17:35.
Ответить с цитированием
  #8  
Старый 14.08.2007, 16:59
DA54 DA54 вне форума
Прохожий
 
Регистрация: 13.05.2007
Сообщения: 37
Репутация: 10
По умолчанию

Большое спасибо!!! Сейчас у меня нет возможности попробовать.Попробую через неделю.Оставь пожалуйста свое мыло тут и асю.Буду тебя спрашивать если что.Ок?
Ответить с цитированием
  #9  
Старый 14.08.2007, 17:17
Аватар для zip000
zip000 zip000 вне форума
Начинающий
 
Регистрация: 24.07.2007
Сообщения: 194
Репутация: 25
По умолчанию

Ну для начала лучше почитай какие-нибудь книжки А если что пиши
zip000@yandex.ru
364301671
__________________
Не профи, но и не чайник . D6 - лучше не придумали. Пока.
Ответить с цитированием
  #10  
Старый 14.08.2007, 17:37
Аватар для zip000
zip000 zip000 вне форума
Начинающий
 
Регистрация: 24.07.2007
Сообщения: 194
Репутация: 25
По умолчанию

На заметку : функция будет работать даж если размер файла не кратен 4, но последние 3,2 или 1 байт файла не будут шифроваться.
__________________
Не профи, но и не чайник . D6 - лучше не придумали. Пока.
Ответить с цитированием
  #11  
Старый 21.08.2007, 15:07
DA54 DA54 вне форума
Прохожий
 
Регистрация: 13.05.2007
Сообщения: 37
Репутация: 10
По умолчанию

Не.Все будет нормально.Просто так как это блочное шифрование,то сделанно так,что последние байты дополняются нулями до кратности.А при расшифровки эти нули убираются.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:46.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025