Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Форум группы: delphi > Оптимизировать работу с множеством


Автор: Akella 2.12.2009, 21:30
Код

function OnlyDec(Inp:string;Ignore:Char):string;
Var
 k:integer;
begin
  Result := '';
  for k := 1 to Length(Inp) do
   if (Inp[k] in ['0'..'9']) or (Inp[k] = Ignore) then
     Result := Result + Inp[k];
end;

Принцип какой? Оставить в выходной строке только цифры и символ, который находится в параметре Ignore

Автор: THandle 3.12.2009, 13:59
Akella, что-то не понял что нужно оптимизировать в данном коде... На выход у тебя идут все символы-числа + символы равные символу Ignore... Я бы изменил до такого вида:

Код


function OnlyDec(const Inp: String; const Ignore: Char): String;
var
 k: integer;
begin
  Result := '';
  for k := 1 to Length(Inp) do
   if Inp[k] in ['0'..'9', Ignore] then
     Result := Result + Inp[k];
end;

Автор: Akella 3.12.2009, 16:18
Я хочу оптимизировать не с точки зрения кода, а с точки зрения времени выполнения самой функции. Чтобы "отсеивание" левых символов выполнялось быстрее.

Автор: Beltar 5.12.2009, 00:46
Не сочтите невежливым, но есть такой рекомендуемый чит, как передача не меняющихся в процедуре строк, как констант, что впрочем уже предложил THandle.

Цитата

Result := Result + Inp[k];


А оно диких перераспределений памяти не создает? Мне кажется, что само вхождение в множество провереряется быстрее всех строковых операций.

Цитата

for k := 1 to Length(Inp)


А Length не в каждой итерации вычисляется?

Автор: THandle 5.12.2009, 00:57
Цитата(Beltar @  5.12.2009,  01:46 Найти цитируемый пост)

А Length не в каждой итерации вычисляется?


Нет. В цикле for начальное и конечное значения вычислюбтся один раз - в самом начале.


Akella, щас попробую задизасмить эту функцию и что нибудь убыстрить...  Результатов не гарантирую)

Автор: THandle 5.12.2009, 01:48
Цитата(Beltar @  5.12.2009,  01:46 Найти цитируемый пост)

А оно диких перераспределений памяти не создает? Мне кажется, что само вхождение в множество провереряется быстрее всех строковых операций.


Да, именно так и есть smile

Думаю лучше выделить в начале большой кусок памяти, а в конце ненужное обрезать.

Что то вроде:

Код

function OnlyDec(const Inp: String; const Ignore: Char): String;
var
  k: Integer;
  Len: Integer;
begin
  SetLength(Result, Length(Inp));
  Len := 0;
  for k := 1 to Length(Inp) do
    if Inp[k] in ['0'..'9', Ignore] then
    begin
      Inc(Len);
      Result[Len] := Inp[k];
    end;
  SetLength(Result, Len);
end;


Тут присвоение будет вызываться только UniqueStringA вместо всех тех перераспределений памяти, которые были раньше. В принципе можно сделать быстрее.

Автор: bems 19.3.2010, 07:51
Akella, проверка вхождения символа в множество это плохо начиная с появления нативного уникода. Нужно в любом случае заменить.

Автор: Akella 19.3.2010, 10:23
И что же может быть быстрее?

У меня D2007, я не использую юникод.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)