Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.01 c
1-1120778579
A013B
2005-07-08 03:22
2005.07.25
Всё тодже String и PAnsiChar правильно сформулированный вопрос.


1-1120559510
Kolan
2005-07-05 14:31
2005.07.25
Как главному потоку узнать что другой уже закончил работу.


6-1113796630
Cherepovets
2005-04-18 07:57
2005.07.25
VPN


1-1120557755
Uran
2005-07-05 14:02
2005.07.25
Событие на bitmap в stringgrid


3-1118381486
__DATA__
2005-06-10 09:31
2005.07.25
Как изменить стандартный пароль от SYSDBA в базе FireBird 1.5





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский