Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.25;
Скачать: CL | DM;

Вниз

Помогите оптимизировать код   Найти похожие ветки 

 
VadimX   (2005-07-03 12:04) [0]

var
 Sx : String;
 i  : integer;
...
 if (pos(",",Sx)>0) then begin
   if (pos(".",Sx)>0) then i:=min(pos(".",Sx),pos(",",Sx))
                      else i:=pos(",",Sx);
 end else begin
   i:=pos(".",Sx)>0;
 end;
...

i - наименьшая позиция вхождения "," или "." в строку.


 
isasa ©   (2005-07-03 12:16) [1]

i - наименьшая позиция вхождения "," или "." в строку.

function MinPos(s: string): integer;
begin
Result:=pos(".",s);
if Result>pos(",",s) then Result:=pos(",",s);
end;


 
VMcL ©   (2005-07-03 12:32) [2]

function MinCommaPointPos(S: String): Integer;
begin
 Result := Min(AnsiPos(".", S), AnsiPos(",", S));
end;


P.S. uses Math.


 
Alexander Panov ©   (2005-07-03 12:34) [3]

isasa ©   (03.07.05 12:16) [1]

function MinPos(s: string): integer;
var
 pz: Integer;
begin
 Result := pos(".",s);
 pz := pos(",",s);
 if Result>pz then Result := pz;
end;


 
VadimX   (2005-07-03 12:36) [4]

Не работает для
s := "31.05";
т.е. вхождение "," нулевое т.е. его нет!
А MinPos=0
Только когда pos(".",s)=0 И pos(",",s)=0;


 
Alexander Panov ©   (2005-07-03 12:38) [5]

Ты лучше скажи, что тебе надо.


 
VMcL ©   (2005-07-03 12:41) [6]

>>[2]

Обманул. Может не быть точки ИЛИ (xor) запятой. К тому же лучше использовать модификатор "const" для параметра.

function MinCommaPointPos(const S: String): Integer;
var
  P: Integer;
begin
  Result := AnsiPos(".", S);
  P := AnsiPos(",", S);
  if ((P < Result) or (Result = 0)) and (P > 0) then
    Result := P;
end;


 
begin...end ©   (2005-07-03 19:36) [7]

Вероятно, я совсем выжил из ума, но мне непонятно, зачем (при условии, что поставлена задача ОПТИМИЗАЦИИ) бегать по строке ДВА раза, когда, судя по заданию [4], достаточно ОДНОГО.

function MinPos(const S: string): Longword;
var
 I: Longword;
begin
 Result := 0;
 for I := 1 to Length(S) do
   if S[I] in [".", ","] then
   begin
     Result := I;
     Break
   end
end.


Функция работает намного быстрее остальных предложенных в этой ветке функций.


 
Anatoly Podgoretsky ©   (2005-07-03 19:47) [8]

begin...end ©   (03.07.05 19:36) [7]
А где критерий оптимизации, автор позабыл его привести.


 
begin...end ©   (2005-07-03 19:53) [9]

> Anatoly Podgoretsky ©   (03.07.05 19:47) [8]

Подождём. Может быть, приведёт.


 
VMcL ©   (2005-07-03 20:02) [10]

>>begin...end ©   (03.07.05 19:36) [7]

В общем случае, было бы ещё неплохо учитывать, что строки могут быть multi-byte.


 
Anatoly Podgoretsky ©   (2005-07-03 20:16) [11]

VMcL ©   (03.07.05 20:02) [10]
За исключением 7 это вроде бы учтено, будет работать и будущих версиях компиляторов. В 7 конечно два прокола.


 
begin...end ©   (2005-07-03 20:30) [12]

> VMcL ©   (03.07.05 20:02) [10]

Поподробнее можно?

> Anatoly Podgoretsky ©   (03.07.05 20:16) [11]

За исключением [7], заданию соответствует только [6].

> В 7 конечно два прокола.
Нельзя ли озвучить?


 
Anatoly Podgoretsky ©   (2005-07-03 20:45) [13]

В качестве счетчика использован фундаментальный тип с ограниченой разрядностью и использовано множество.
Первое препятсвует переходу на большую разрядность, а второе испольхованию строк, в которых используется не AnsiChar, вспоминаем, что тип string не фундаментальный.
The reserved word string functions like a generic type identifier.
И даже сейчас можно управлять типом string, а в будущем предусмотрено, что типом по умолчанию будет не AnsiString, а WideString.


 
begin...end ©   (2005-07-03 21:01) [14]

> Anatoly Podgoretsky ©   (03.07.05 20:45) [13]

> В качестве счетчика использован фундаментальный тип с
> ограниченой разрядностью

OK, заменяем на Cardinal.

> The reserved word string functions like a generic type
> identifier.

It"s a good idea to use generic types when possible, since they provide optimal performance and portability.
:-)


 
Anatoly Podgoretsky ©   (2005-07-03 21:07) [15]

Значит соглачен, всегда учитывай, что этот компилятор не последний, кто этого не придерживался пострадал при переходе с 16 бит на 32


 
SergP ©   (2005-07-03 23:03) [16]


> if S[I] in [".", ","] then


А вот интерестно, будет ли такое:

if ord(S[I]) or 2 = 46 then

работать быстрее?


 
VMcL ©   (2005-07-04 08:10) [17]

>>begin...end ©   (03.07.05 20:30) [12]

>Поподробнее можно?

См. исходный код AnsiPos. Она поддерживает MBCS.



Страницы: 1 вся ветка

Текущий архив: 2005.07.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.046 c
1-1120322132
Brack
2005-07-02 20:35
2005.07.25
Как двигать обьекты?


4-1117453733
chili
2005-05-30 15:48
2005.07.25
как можно отследить появление нового процесса в системе?


1-1120656196
Петр2
2005-07-06 17:23
2005.07.25
Вопрос начинающего програмиста


10-1097659551
WebErr
2004-10-13 13:25
2005.07.25
Позднее связывание


14-1119972717
Viktop
2005-06-28 19:31
2005.07.25
Установка JEDI VCL 3.0 в Delphi 2005