Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
1-1153213762
Igor_thief
2006-07-18 13:09
2006.09.03
MainMenu в любой позиции формы


6-1143721565
vic_774N
2006-03-30 16:26
2006.09.03
решение проблемы подсей


15-1155003142
SkyRanger
2006-08-08 06:12
2006.09.03
Будущее Windows


4-1145187125
gektorrr
2006-04-16 15:32
2006.09.03
Как узнать количество памяти видеокарты????


1-1153808221
Zilog_
2006-07-25 10:17
2006.09.03
Как правильно перевести с С на Делфи?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский