Speed up max_piece_type()
authorJoona Kiiski <joona.kiiski@gmail.com>
Mon, 27 Oct 2014 14:05:24 +0000 (14:05 +0000)
committerJoona Kiiski <joona.kiiski@gmail.com>
Mon, 27 Oct 2014 20:25:57 +0000 (20:25 +0000)
Write code in the way that allows compiler to perform loop unrolling.

My measurement (32 cycles each):

Orig:

Time (Mean: 2466.59375, Trimmed mean: 2464.25, Std: 12.6869487803348)
Nodes (Mean: 4294458, Trimmed mean: 4294458, Std: 0)
Speed (Mean: 1741.09247987678, Trimmed mean: 1742.72879715475, Std: 8.93612608292678)

Time (Mean: 2470.15625, Trimmed mean: 2468.75, Std: 12.7484581610433)
Nodes (Mean: 4294458, Trimmed mean: 4294458, Std: 0)
Speed (Mean: 1738.58176151341, Trimmed mean: 1739.54618465403, Std: 8.95585822316946)

Mod:

Time (Mean: 2449.90625, Trimmed mean: 2445.9375, Std: 12.1000116635508)
Nodes (Mean: 4294458, Trimmed mean: 4294458, Std: 0)
Speed (Mean: 1752.94829372932, Trimmed mean: 1755.75934908231, Std: 8.61478453124504)

Time (Mean: 2442.78125, Trimmed mean: 2441.1875, Std: 8.17839157228837)
Nodes (Mean: 4294458, Trimmed mean: 4294458, Std: 0)
Speed (Mean: 1758.03872783803, Trimmed mean: 1759.16825356261, Std: 5.81131316346191)

No functional change

src/evaluate.cpp

index 8c70016..d5a4bb9 100644 (file)
@@ -500,7 +500,10 @@ namespace {
     assert(target & (pos.pieces(C) ^ pos.pieces(C, KING)));
 
     PieceType pt;
-    for (pt = QUEEN; !(target & pos.pieces(C, pt)); --pt) {}
+    for (pt = QUEEN; pt >= KNIGHT; --pt)
+        if (target & pos.pieces(C, pt))
+            break;
+
     return pt;
   }