![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите оптимизировать код
VadimX © (2005-07-03 12:04:00)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 - наименьшая позиция вхождения ',' или '.' в строку.
VMcL (2005-07-04 08:10:00) [1]>> begin...end © (03.07.05 20:30) [12]
> Поподробнее можно?
См. исходный код AnsiPos. Она поддерживает MBCS.
SergP (2005-07-03 23:03:00) [2]
> if S[I] in ['.', ','] then
А вот интерестно, будет ли такое:
if ord(S[I]) or 2 = 46 then
работать быстрее?
Anatoly Podgoretsky (2005-07-03 21:07:00) [3]Значит соглачен, всегда учитывай, что этот компилятор не последний, кто этого не придерживался пострадал при переходе с 16 бит на 32
begin...end (2005-07-03 21:01:00) [4]> 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 20:45:00) [5]В качестве счетчика использован фундаментальный тип с ограниченой разрядностью и использовано множество.
Первое препятсвует переходу на большую разрядность, а второе испольхованию строк, в которых используется не AnsiChar, вспоминаем, что тип string не фундаментальный.
The reserved word string functions like a generic type identifier.
И даже сейчас можно управлять типом string, а в будущем предусмотрено, что типом по умолчанию будет не AnsiString, а WideString.
begin...end (2005-07-03 20:30:00) [6]> VMcL © (03.07.05 20:02) [10]
Поподробнее можно?
> Anatoly Podgoretsky © (03.07.05 20:16) [11]
За исключением [7], заданию соответствует только [6].
> В 7 конечно два прокола.
Нельзя ли озвучить?
Anatoly Podgoretsky (2005-07-03 20:16:00) [7]VMcL © (03.07.05 20:02) [10]
За исключением 7 это вроде бы учтено, будет работать и будущих версиях компиляторов. В 7 конечно два прокола.
VMcL (2005-07-03 20:02:00) [8]>> begin...end © (03.07.05 19:36) [7]
В общем случае, было бы ещё неплохо учитывать, что строки могут быть multi-byte.
begin...end (2005-07-03 19:53:00) [9]> Anatoly Podgoretsky © (03.07.05 19:47) [8]
Подождём. Может быть, приведёт.
Anatoly Podgoretsky (2005-07-03 19:47:00) [10]begin...end © (03.07.05 19:36) [7]
А где критерий оптимизации, автор позабыл его привести.
begin...end (2005-07-03 19:36:00) [11]Вероятно, я совсем выжил из ума, но мне непонятно, зачем (при условии, что поставлена задача ОПТИМИЗАЦИИ) бегать по строке ДВА раза, когда, судя по заданию [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.
Функция работает намного быстрее остальных предложенных в этой ветке функций.
VMcL (2005-07-03 12:41:00) [12]>> [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;
Alexander Panov (2005-07-03 12:38:00) [13]Ты лучше скажи, что тебе надо.
VadimX (2005-07-03 12:36:00) [14]Не работает для
s := '31.05';
т.е. вхождение ',' нулевое т.е. его нет!
А MinPos=0
Только когда pos('.',s)=0 И pos(',',s)=0;
Alexander Panov (2005-07-03 12:34:00) [15]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;
VMcL (2005-07-03 12:32:00) [16]
function MinCommaPointPos(S: String): Integer;
begin
Result := Min(AnsiPos('.', S), AnsiPos(',', S));
end;
P.S. uses Math.
isasa (2005-07-03 12:16:00) [17]i - наименьшая позиция вхождения ',' или '.' в строку.
function MinPos(s: string): integer;
begin
Result:=pos('.',s);
if Result>pos(',',s) then Result:=pos(',',s);
end;