J'ai fait un programme qui compare les performances de trois fonctions : la fonction actuellement utilisée dans le code de mon moteur d'échecs, une autre que j'ai écrite et une autre basée sur la fonction BitCount en Assembleur.
Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 {$asmMode intel} uses SysUtils, Damier, Tables; type TFonction = function(const ADamier: TDamier): integer; function CompteCasesAllumees2(const ADamier: TDamier): integer; const CZero = TDamier(0); CUn = TDamier(1); var LDamier: TDamier; begin result := 0; LDamier := ADamier; while LDamier <> CZero do begin if LDamier and CUn = CUn then Inc(result); LDamier := LDamier shr 1; end; end; function BitCount(var n : Int64): byte; assembler; nostackframe; inline; // Testé en 32 et 64 bits asm popcnt edx, dword ptr [n] // 32 bits eax = @n, en 64 bits rcx = @n popcnt eax, dword ptr [n+4] add eax, edx end; function CompteCasesAllumees3(const ADamier: TDamier): integer; var LDamier: TDamier; begin LDamier := ADamier; result := BitCount(LDamier); end; procedure Test(ADamier: TDamier; AFonction: TFonction); var i, res: integer; t: cardinal; begin t := GetTickCount64; for i := 1 to 1000000 do res := AFonction(ADamier); WriteLn(GetTickCount64 - t); end; const CCavaliers = %0100001000000000000000000000000000000000000000000000000001000010; begin Test(CCavaliers, @CompteCasesAllumees); Test(CCavaliers, @CompteCasesAllumees2); Test(CCavaliers, @CompteCasesAllumees3); end.
La différence est si énorme que je me demande si je ne me suis pas trompé quelque part !
Code X : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 2344 969 31
Le test a été fait avec FPC 32 bits. Ci-joint le code source complet.
Partager