アセンブラ… (・∀・)イイ!
■ このスレッドは過去ログ倉庫に格納されています
0217212
NGNGTest8(下のソース)を20回ぐらい連続して呼び出すと、
Test6と同じぐらいの速度になりました。
さっぱり分かりません。 Test6は↓にあります。
ttp://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=049229
procedure Test8(var S : string );
var
ConvTbl: array[Word] of Word;
I, Count, Len: Integer; P: PWord;
begin
for I := low(ConvTbl) to High(ConvTbl) do ConvTbl[I] := I;
ConvTbl[PWord(PChar('AC'))^] := PWord(PChar('CA'))^;
ConvTbl[PWord(PChar('AT'))^] := PWord(PChar('TA'))^;
ConvTbl[PWord(PChar('AG'))^] := PWord(PChar('GA'))^;
ConvTbl[PWord(PChar('CA'))^] := PWord(PChar('AC'))^;
ConvTbl[PWord(PChar('CT'))^] := PWord(PChar('TC'))^;
ConvTbl[PWord(PChar('CG'))^] := PWord(PChar('GC'))^;
ConvTbl[PWord(PChar('GA'))^] := PWord(PChar('AG'))^;
ConvTbl[PWord(PChar('GC'))^] := PWord(PChar('CG'))^;
ConvTbl[PWord(PChar('GT'))^] := PWord(PChar('TG'))^;
ConvTbl[PWord(PChar('TA'))^] := PWord(PChar('AT'))^;
ConvTbl[PWord(PChar('TC'))^] := PWord(PChar('CT'))^;
ConvTbl[PWord(PChar('TG'))^] := PWord(PChar('GT'))^;
P := Pointer(PChar(S));
Count := Length(S) div 2;
asm
pusha
mov ecx, Count
mov esi, P
lea edi, ConvTbl
xor eax, eax
@@Loop:
mov ax, [esi]
mov ax, [edi + eax]
mov [esi], ax
add esi, 2
dec ecx
jnz @@Loop
popa
end;
Len := Length(S);
if not Odd(Len) then
begin
case S[Len] of
'A': S[Len] := 'T';
'T': S[Len] := 'A';
'G': S[Len] := 'C';
'C': S[Len] := 'G';
end;
end;
end;
■ このスレッドは過去ログ倉庫に格納されています