Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.03;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.07 c
15-1155297927
ArtemESC
2006-08-11 16:05
2006.09.03
Пытался установить 4 диска Брокгаузъ и Ефронъ...


15-1154502103
Суслик
2006-08-02 11:01
2006.09.03
Удобный клиент для новостных групп (ищу)


2-1155203930
evgenij_
2006-08-10 13:58
2006.09.03
Потоки


2-1155209189
Leyhont
2006-08-10 15:26
2006.09.03
SSH


15-1155364407
imbalacedees
2006-08-12 10:33
2006.09.03
mail.ru