HexToInt的实现&速度大比拼 (300分)

你们就是要HexToInt这样的功能吗?还是练习用汇编呢?这么长长的真浪费时间啊
 
//你们就是要HexToInt这样的功能吗?还是练习用汇编呢?这么长长的真浪费时间啊
你看楼主在二楼发的帖子不就知道了:
来自:tseug, 时间:2003-11-12 22:21:00, ID:2290287
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2266723

当然是拼速度玩了[:D]

 
呵呵,大叔要是把帖子名改为“HexToInt 速度大比拼”,大家就容易明白了:)

 
DoubleWood 兄,看看我的第 5 个版本速度如何?

 
在家测试结果如下:
HexToInt_tseug0 (4609ms).
HexToInt_DoubleWood (3687ms).
HexToInt_DoubleWood2 (2829ms).
HexToInt_beta1 (3766ms).
HexToInt_beta5 (3719ms).

HexToInt_tseug0 (4500ms).
HexToInt_DoubleWood (3640ms).
HexToInt_DoubleWood2 (2828ms).
HexToInt_beta1 (3703ms).
HexToInt_beta5 (3750ms).

HexToInt_tseug0 (4453ms).
HexToInt_DoubleWood (3625ms).
HexToInt_DoubleWood2 (2766ms).
HexToInt_beta1 (3735ms).
HexToInt_beta5 (3656ms).

HexToInt_tseug0 (4516ms).
HexToInt_DoubleWood (3672ms).
HexToInt_DoubleWood2 (2765ms).
HexToInt_beta1 (3750ms).
HexToInt_beta5 (3656ms).
基本可以确定的是,绝对与CPU有关。看来在更高的机器上,你的代码不能更充分的发挥
CPU的性能,呵呵。
怎么就没有其他人提交一下测试结果呢:(
 
无语言:(

 
[:D][8D][:(][:(!][:)]
 
DoubleWood 兄,干脆还是让你的 Delphi 帮我生成二进制代码吧:)
我根据 beta5 的算法写了个 OP 版的实现,麻烦 DoubleWood 兄再
帮忙测试一下:)

function HexToInt_beta6(const S: string): DWORD;
const
SmallTbl: array [0..255] of Byte = (
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 16, 16, 16, 16, 16, 16,
16, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16);
var
i, Len: Integer;
PResult: PChar;
begin
PResult := PChar(Integer(@Result) + 4);
Len := PInteger(Integer(S) - 4)^;
if Len <= 0 then
Exit;

if Odd(Len) then
begin
Dec(PResult);
PResult^ := Chr(SmallTbl[Ord(S[1])]);
if PResult^ >= Chr(16) then
begin
Result := 0;
Exit;
end;
end;

i := 1;
while i <= Len do
begin
Dec(PResult);
if (S <= 'f') and (S[i + 1] <= 'f') then
PResult^ := Chr(BetaTable5[PWord(@S)^])
else begin
Result := 0;
Exit;
end;
Inc(i);
Inc(i);
end;
end;


在我这里 beta6 和 beta5 速度几乎一样,要是在你那里速度相差很大,
就很说明问题了;而要是还是一样,我就真的无语言了。

 
没有什么太大的变化,而且很遗憾的告诉你,你的错误判断不完全……

HexToInt_tseug0 (4532ms). 2882343476
HexToInt_DoubleWood (3547ms). 2882343476
HexToInt_DoubleWood2 (2703ms). 2882343476
HexToInt_beta1 (3531ms). 2882343476
HexToInt_beta5 (3547ms). 2882343476
HexToInt_beta6 (3859ms). 2882343476

HexToInt_tseug0 (4468ms). 2882343476
HexToInt_DoubleWood (3516ms). 2882343476
HexToInt_DoubleWood2 (2594ms). 2882343476
HexToInt_beta1 (3547ms). 2882343476
HexToInt_beta5 (3531ms). 2882343476
HexToInt_beta6 (3844ms). 2882343476
 
其实,也没必要用 Inc 和 Dec
i := i + 1 和 Inc(i)
编译的时候生成的代码都差不多
 

Similar threads

I
回复
0
查看
618
import
I
I
回复
0
查看
681
import
I
I
回复
0
查看
662
import
I
I
回复
0
查看
653
import
I
I
回复
0
查看
777
import
I
顶部