コードは次のように記述でき、良好なパフォーマンス結果が得られます。
function IsStrANumber(const S: AnsiString): Boolean; inline;
var
P: PAnsiChar;
begin
Result := False;
P := PAnsiChar(S);
while True do
begin
case PByte(P)^ of
0: Break;
$30..$39: Inc(P);
else
Exit;
end;
end;
Result := True;
end;
Intel(R) Core(TM)2 CPU T5600 @ 1.83GHz
- x32 ビット: 2730 ミリ秒
- x64 ビット: 3260 ミリ秒
Intel(R) Pentium(R) D CPU 3.40GHz
- x32 ビット: 2979 ミリ秒
- x64 ビット: 1794 ミリ秒
上記のループを巻き戻すと、実行が速くなる可能性があります。
function IsStrANumber(const S: AnsiString): Boolean; inline;
type
TStrData = packed record
A: Byte;
B: Byte;
C: Byte;
D: Byte;
E: Byte;
F: Byte;
G: Byte;
H: Byte;
end;
PStrData = ^TStrData;
var
P: PStrData;
begin
Result := False;
P := PStrData(PAnsiChar(S));
while True do
begin
case P^.A of
0: Break;
$30..$39:
case P^.B of
0: Break;
$30..$39:
case P^.C of
0: Break;
$30..$39:
case P^.D of
0: Break;
$30..$39:
case P^.E of
0: Break;
$30..$39:
case P^.F of
0: Break;
$30..$39:
case P^.G of
0: Break;
$30..$39:
case P^.H of
0: Break;
$30..$39: Inc(P);
else
Exit;
end;
else
Exit;
end;
else
Exit;
end;
else
Exit;
end;
else
Exit;
end;
else
Exit;
end;
else
Exit;
end;
else
Exit;
end;
end;
Result := True;
end;
Intel(R) Core(TM)2 CPU T5600 @ 1.83GHz
- x32 ビット: 2199 ミリ秒
- x64 ビット: 1934 ミリ秒
Intel(R) Pentium(R) D CPU 3.40GHz
- x32 ビット: 1170 ミリ秒
- x64 ビット: 1279 ミリ秒
Arnaud Bouchez が言ったことも適用すると、さらに高速化できます。