Главная страница
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.044 c
15-1155104866
Jeer
2006-08-09 10:27
2006.09.03
Вперед к Clipper !


15-1154813020
a new
2006-08-06 01:23
2006.09.03
Подскажите Жаваскрипт прячущий ссылку?


2-1155118135
UMU
2006-08-09 14:08
2006.09.03
Запрос на базе другого запроса


2-1155750524
pvi
2006-08-16 21:48
2006.09.03
CreateRemoteComObject


15-1154465545
Gero
2006-08-02 00:52
2006.09.03
Земля сегодня