Bitboards: custom vs std::bitset

Discussion of chess software programming and technical issues.

Moderator: Ras

benvining
Posts: 22
Joined: Fri May 30, 2025 10:18 pm
Full name: Ben Vining

Bitboards: custom vs std::bitset

Post by benvining »

When starting work on my new engine, I initially implemented by Bitboard struct using std::bitset internally. This worked fine, but I suspected that converting the bitset to/from integers was a bit slow, so I've just refactored to use a std::uint64_t directly and I indeed saw a speedup. I thought I'd share the benchmark results in case anyone was interested:

Bitboard implemented with std::bitset

Code: Select all

Benchmarking legal move generation
benchmark name            samples       iterations    est run time
                                      mean          low mean      high mean
                                      std dev       low std dev   high std dev
 -------------------------------------------------------------------------------
 Legal move generation               100                   1     11.904 ms 
                                         119.429 us    118.934 us    120.607 us 
                                          3.6695 us    1.89794 us    7.49049 us 
                                          
Benchmarking bitboard iteration
benchmark name            samples       iterations    est run time
                                      mean          low mean      high mean
                                      std dev       low std dev   high std dev
 -------------------------------------------------------------------------------
Iterate bitboard indices                100              4362     1.3086 ms 
                                         3.83097 ns       3.82218 ns    3.84473 ns 
                                       0.0550717 ns  0.0387798 ns  0.0730032 ns 
Bitboard implemented using std::uint64_t directly

Code: Select all

 Benchmarking legal move generation
benchmark name           samples       iterations    est run time
                                     mean          low mean      high mean
                                    std dev       low std dev   high std dev
-------------------------------------------------------------------------------
Legal move generation                100                  4      2.2196 ms 
                                         5.52037 us    5.46453 us    5.73871 us 
                                         469.346 ns    13.5486 ns    1.09434 us 
                                         
Benchmarking bitboard iteration
benchmark name             samples       iterations    est run time
                                      mean          low mean      high mean
                                      std dev       low std dev   high std dev
 -------------------------------------------------------------------------------
 Iterate bitboard indices                 100           8804      880.4 us 
                                         1.90721 ns     1.9064 ns     1.9082 ns 
                                      0.00457192 ns 0.00376326 ns 0.00632791 ns 
benvining
Posts: 22
Joined: Fri May 30, 2025 10:18 pm
Full name: Ben Vining

Re: Bitboards: custom vs std::bitset

Post by benvining »

These benchmarks were run on an Apple Silicon Macbook, built with Clang and Clang's stdlib.