Ik heb in Delphi code geschreven die checksums uitrekent van een TrueType font file. Op zich werkt dat allemaal prima, maar de code kan vast wel wat sneller worden.
Het lullige van TrueType fonts is dat de byte-volgorde van de Mac afkomstig is en dus precies omgekeerd is aan de byte-volgorde van een pc. Om de (32-bits) checksum te berekenen, moet ik daarom een paar miljoen keer vier bytes van plaats verwisselen. Dat doet de volgende functie:
Delphi maakt dit ervan:

Hoe kan ik deze functie een stuk sneller maken?
Het lullige van TrueType fonts is dat de byte-volgorde van de Mac afkomstig is en dus precies omgekeerd is aan de byte-volgorde van een pc. Om de (32-bits) checksum te berekenen, moet ik daarom een paar miljoen keer vier bytes van plaats verwisselen. Dat doet de volgende functie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| TBigLongword = packed record // 32-bit unsigned integer
HiWordHiByte: Byte;
HiWordLoByte: Byte;
LoWordHiByte: Byte;
LoWordLoByte: Byte;
end;
function BigLongwordToLongword(const BigLongword: TBigLongword): Longword;
begin
Result := (BigLongword.HiWordHiByte shl 24) or
(BigLongword.HiWordLoByte shl 16) or
(BigLongword.LoWordHiByte shl 8) or
BigLongword.LoWordLoByte;
end; |
Delphi maakt dit ervan:

Hoe kan ik deze functie een stuk sneller maken?
Een goede grap mag vrienden kosten.