Главная страница
    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.035 c
3-1118390525
testochka
2005-06-10 12:02
2005.07.25
проблема Alias для ODBC for Oracle


4-1117508574
Владимир_К
2005-05-31 07:02
2005.07.25
Иконка в Trey


1-1120630131
Demidoff
2005-07-06 10:08
2005.07.25
Как произвести обработку архива в автономном режиме?


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


1-1120587319
АлексейС
2005-07-05 22:15
2005.07.25
Как оперировать данными интернет сайта ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский