Модераторы: THandle, bems
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизировать работу с множеством, if (Inp[k] in ['0'..'9']) then 
:(
    Опции темы
Akella
  Дата 2.12.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 7
Всего: 329



Код

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
PM MAIL   Вверх
THandle
Дата 3.12.2009, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 7
Всего: 372



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;

PM   Вверх
Akella
Дата 3.12.2009, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 7
Всего: 329



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

Это сообщение отредактировал(а) Akella - 3.12.2009, 17:10
PM MAIL   Вверх
Beltar
Дата 5.12.2009, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: нет
Всего: 7



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

Цитата

Result := Result + Inp[k];


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

Цитата

for k := 1 to Length(Inp)


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


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
THandle
Дата 5.12.2009, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 7
Всего: 372



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

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


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


Akella, щас попробую задизасмить эту функцию и что нибудь убыстрить...  Результатов не гарантирую)
PM   Вверх
THandle
Дата 5.12.2009, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 7
Всего: 372



Цитата(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 вместо всех тех перераспределений памяти, которые были раньше. В принципе можно сделать быстрее.
PM   Вверх
bems
Дата 19.3.2010, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 2
Всего: 88



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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Akella
Дата 19.3.2010, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 7
Всего: 329



И что же может быть быстрее?

У меня D2007, я не использую юникод.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle

Добро пожаловать в форум группы "Delphi".

В разделе разрешается:

  • Флудить (в приемлемых величинах)
  • Обсуждать модерирование данного раздела (но не его модератора)
  • Добавлять свои правила если они не противоречат существующим
  • Делать наезды на пешеходов***

Строго запрещено:

  • Размещать рекламу
  • Совершать оскорбления личностей
  • Материться
  • *** Пешеходами не являются (ко)модераторы, админы, участники клуба.

Если Вам понравилась атмосфера форума, заходите к нам чаще! Люблю, целую, вечно Ваш, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Форум группы: delphi | Следующая тема »


 




[ Время генерации скрипта: 0.0482 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.