16,748
社区成员
发帖
与我相关
我的任务
分享
function Rot(x, k: Cardinal): Cardinal; inline;
begin
Result := (x shl k) or (x shr (32 - k));
end;
procedure Mix(var a, b, c: Cardinal); inline;
begin
Dec(a, c); a := a xor Rot(c, 4); Inc(c, b);
Dec(b, a); b := b xor Rot(a, 6); Inc(a, c);
Dec(c, b); c := c xor Rot(b, 8); Inc(b, a);
Dec(a, c); a := a xor Rot(c,16); Inc(c, b);
Dec(b, a); b := b xor Rot(a,19); Inc(a, c);
Dec(c, b); c := c xor Rot(b, 4); Inc(b, a);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
I, J, A, B, C: Cardinal;
Tick: Cardinal;
Rsut: Double;
begin
Rsut := 0;
Tick := GetTickCount;
for I := 0 to 9999 do
begin
for J := 0 to 9999 do
begin
A := I;
B := J;
C := I;
Mix(A, B, C);
Rsut := Rsut + A + B + C;
end;
end;
Tick := GetTickCount - Tick;
ShowMessage(IntToStr(Tick) + ':' + FloatToStr(Rsut));
end;
#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
#define mix(a,b,c) \
{ \
a -= c; a ^= rot(c, 4); c += b; \
b -= a; b ^= rot(a, 6); a += c; \
c -= b; c ^= rot(b, 8); b += a; \
a -= c; a ^= rot(c,16); c += b; \
b -= a; b ^= rot(a,19); a += c; \
c -= b; c ^= rot(b, 4); b += a; \
}
void Test1()
{
double r = 0;
DWORD a, b, c;
DWORD tick = GetTickCount();
for (int i = 0; i < 10000; ++i)
{
for (int j = 0; j < 10000; ++j)
{
a = i;
b = j;
c = i;
mix(a, b, c);
r = r + a + b + c;
}
}
tick = GetTickCount() - tick;
printf("%u : %.2f\n", tick, r);
}