Медленный Insert
От: cargo Россия  
Дата: 14.04.05 16:08
Оценка:
Нижеприведенный кусок кода работает чрезвычайно медленно, например, если lData 6 MB, то процедура занимаетс порядка 5ти минут. Есть ли альтернативный скоростной вариант?


const
  MAX_LINE_LENGTH = 64;
...
  P := MAX_LINE_LENGTH + 1;
  while P <= Length(lData) do begin
    Insert(EOL, lData, P);
    P := P + MAX_LINE_LENGTH + 2;
  end;
Re: Медленный Insert
От: Danchik Украина  
Дата: 14.04.05 17:00
Оценка: 8 (2) +1
Здравствуйте, cargo, Вы писали:

C>Нижеприведенный кусок кода работает чрезвычайно медленно, например, если lData 6 MB, то процедура занимаетс порядка 5ти минут. Есть ли альтернативный скоростной вариант?



C>
C>const
C>  MAX_LINE_LENGTH = 64;
C>...
C>  P := MAX_LINE_LENGTH + 1;
C>  while P <= Length(lData) do begin
C>    Insert(EOL, lData, P);
C>    P := P + MAX_LINE_LENGTH + 2;
C>  end;
C>


Конечно есть, но как и все скоростное оно побольше
Я думаю эта процедура просто промчится, у меня это милисекунда

function SetEOL(aData: string): string;
const
  MAX_LINE_LENGTH = 64;
  EOL = #13#10;
var
  aNewData : string;
  aNewDataSize : Integer;
  P, NewP : PChar;
  aDataLength : Integer;
  aLineLen    : Integer;
begin
  aDataLength := Length (aData);
  aNewDataSize := aDataLength + ((aDataLength - 1) div MAX_LINE_LENGTH) * Length (EOL);
  SetLength (aNewData, aNewDataSize);

  P := PChar (aData);
  NewP := PChar (aNewData);
  while aDataLength > 0 do begin
    aLineLen := Min (aDataLength, MAX_LINE_LENGTH);
    Move (P^, NewP^, aLineLen);
    Dec (aDataLength, aLineLen);
    Inc (P, aLineLen);
    Inc (NewP, aLineLen);
    if aDataLength > 0 then begin
      Move (EOL, NewP^, Length (EOL));
      Inc (NewP, Length (EOL));
    end;
  end;

  Result := aNewData;
end;
Re[2]: Медленный Insert
От: cargo Россия  
Дата: 14.04.05 20:14
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Конечно есть, но как и все скоростное оно побольше

D>Я думаю эта процедура просто промчится, у меня это милисекунда

Ого!
Re[3]: Медленный Insert
От: Softwarer http://softwarer.ru
Дата: 15.04.05 05:52
Оценка: +1
Здравствуйте, cargo, Вы писали:

C>Ого!


Ничего удивительного. Вы насилуете тип данных операцией, для которой он подходит хуже всего.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.