Форум: "Начинающим";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];
ВнизHexToStr Найти похожие ветки
← →
Пусик © (2006-08-16 03:24) [40]
> KilkennyCat © (16.08.06 03:07) [38]
По крайней мере, код Шпиёна из [37] весьма быстр.
← →
Fay © (2006-08-16 04:24) [41]2 Шпиён (16.08.06 1:40) [37]
Это называется "очень сильное колдунство"
Что, по-твоему выдастHexToStr("")
?
← →
Fay © (2006-08-16 04:32) [42]А прирост скорости какой большой! Сдуреть просто...
function HexToStr(const s : string) : string;
var
Len : integer;
begin
Len := integer(pointer(integer(pointer(s)) - 4)^) shr 1;
SetLength(Result, Len);
SetLength(Result, HexToBin(pchar(s), pchar(result), Len));
end;
function HexToStr2(const s : string) : string;
var
Len : integer;
begin
Len := Length(s) div 2;
SetLength(Result, Len);
SetLength(Result, HexToBin(pchar(s), pchar(result), Len));
end;
procedure TForm1.Button1Click(Sender : TObject);
var
i : Integer;
tc : DWORD;
s : string;
begin
s := "30313233343536373839";
tc := GetTickCount;
for i := 0 to 999999 do
s := Copy(s + HexToStr(s), 1, 20);
ShowMessage(Format("%d", [GetTickCOunt - tc]));
end;
← →
Шпиён (2006-08-16 05:24) [43]
> Fay © (16.08.06 04:24) [41]
> 2 Шпиён (16.08.06 1:40) [37]
> Это называется "очень сильное колдунство"
> Что, по-твоему выдаст HexToStr("") ?
"Что-то вроде такого" не означает "сделай точно так же без всяких проверок входных данных" -)
HexToStr("") в таком варианте выдаст AV.
Если ты заметил, в [36] написано
Попробовал бы воспользоваться Lenght (более универсальный
способ) или получить длину строки примерно как integer(pointer(integer(pointer(s))- 4)^)
И, возможно, использовал бы сдвиг вправо вместо деления
нацело -)
Основная мысль была - заменить StrLen.
[37] просто иллюстрация к [36].
← →
Шпиён (2006-08-16 05:57) [44]
> А прирост скорости какой большой! Сдуреть просто...
По производительности (компилятор D6, про другие ничего не могу сказать) варианты
1) Len:=Lenght(s) div 2;
2) Len:=integer(pointer(integer(pointer(s))-4)^) shr 1;
должны быть примерно одинаковы:
1) Len:=Lenght(s) div 2;
mov eax,[ebp-$04]
call@StrLen
sar eax,1
@StrLen:
test eax,eax
jz +$03
mov eax,[eax-$04]
ret
2) Len:=integer(pointer(integer(pointer(s))-4)^) shr 1;
mov eax,[ebp-$04]
sub eax,$04
jno +$05
call @IntOver
mov eax,[eax]
shr eax,1
ps
И оба будут быстрее, чем [7]
function StrLen(const Str: PChar): Cardinal; assembler;
asm
MOV EDX,EDI
MOV EDI,EAX
MOV ECX,0FFFFFFFFH
XOR AL,AL
REPNE SCASB
MOV EAX,0FFFFFFFEH
SUB EAX,ECX
MOV EDI,EDX
end;
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.041 c