Форум: "Основная";
Текущий архив: 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