Optimization chance for following Bit-Operations?

后端 未结 1 1136
旧巷少年郎
旧巷少年郎 2020-12-30 07:15

Do you think there is room for optimizations in the function haswon (see below)?

I recognized that changing the argument type from __int64 to unsi

相关标签:
1条回答
  • 2020-12-30 07:37

    The idea behind this version is to avoid the strict testing order (the intermediate returns force the compiler to evaluate the conditions one at a time, in order) as well as the branching associated with multiple if statements:

    // return whether newboard includes a win
    bool haswon2(uint64_t newboard)
    {
        uint64_t y = newboard & (newboard >> 6);
        uint64_t z = newboard & (newboard >> 7);
        uint64_t w = newboard & (newboard >> 8);
        uint64_t x = newboard & (newboard >> 1);
        return (y & (y >> 2 * 6)) | // check \ diagonal
               (z & (z >> 2 * 7)) | // check horizontal -
               (w & (w >> 2 * 8)) | // check / diagonal
               (x & (x >> 2));      // check vertical |
    }
    

    With a decent level of optimization you can really think of w, x, y and z as "aliases" for the shifted values. This means the final return statement throws the entire operation into a big soup for the compiler to play with. On my system this version takes only 65% of the runtime of the original (including the overhead of generating a random position each time). It might win by a larger percentage if the boards are mainly non-winning.

    Looking at the disassembly of each (from gcc -O3) the original version is actually shorter, so it's likely the lack of branching in the tight inner loop that really helps.

    0 讨论(0)
提交回复
热议问题