Hallo und vielen Dank nochmal auch an Mr OR!
Ich habe alle Anregungen (sofern ich sie verstanden habe) einmal verwurstet und versucht sie an Hand eines Benchmarks zu beurteilen.
Delphi-Quellcode:
function Big2Little32c(ina:tpa4):integer;
var
dd : integer;
begin
dd:= ina^[3]+
(ina^[2]
shl 8)+
(ina^[1]
shl 16)+
(ina^[0]
shl 24);
result:=dd;
end;
function Big2Little32H(ina:tpa4):integer;
begin
result:=0;
result:= result
or
ina[3]
or
(ina[2]
shl 8)
or
(ina[1]
shl 16)
or
(ina[0]
shl 24);
end;
function Big2Little32R(ina:tpa4):integer;
type
tLittRec=record
case integer
of
1 : (wert:integer);
2 : (aa:
array [0..3]
of byte);
end;
var
my : tLittRec ;
begin
my.wert:=0;
my.aa[0]:=ina[3];
my.aa[1]:=ina[2];
my.aa[2]:=ina[1];
my.aa[3]:=ina[0];
result:=my.wert;
end;
function SwapInt32(Value: Integer): integer;
register;
asm
BSWAP EAX
end;
Big2Little32c/function Big2Little32H sind etwa gleich schnell (im Rahmen der Messgenauigkeit)
SwapInt32 ist etwas schneller(-10%)
Big2Little32R(ina:tpa4):integer;
Braucht ca. die dreifache Zeit.
Da ich nur ca 1000-3000 Werte lesen muß ist der Unterschied eigentlich irrelevant, aber in diesem Falle ist small beautiful and fast.
Ich werde SirThornberrys Anregung aufgreifen und da noch ein "LängenMäntelchen" um legen, dann hab ich was ich will.
Vielen Dank nochmal
K-H
Falls es jemanden interessiert, im Anhang das Programm und die erhaltenen Werte.