From: Marco Costalba Date: Mon, 2 Mar 2009 16:32:30 +0000 (+0100) Subject: Micro optimize copy of new state in do_move() X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=772a37cd54212a7b045781b69eb190bd5d4e3161 Micro optimize copy of new state in do_move() Instead of copying all, copy only the fields that are updated incrementally, not the ones that are recalcuated form scratch anyway. This reduces copy overhead of 30%. No functional change. Signed-off-by: Marco Costalba --- diff --git a/src/position.cpp b/src/position.cpp index 67680b1f..fc9e23c9 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -707,10 +707,17 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) { assert(is_ok()); assert(move_is_ok(m)); - // Copy some fields of old state to our new StateInfo object (except the - // captured piece, which is taken care of later) and switch state pointer - // to point to the new, ready to be updated, state. - newSt = *st; + // Copy some fields of old state to our new StateInfo object except the + // ones which are recalculated from scratch anyway, then switch our state + // pointer to point to the new, ready to be updated, state. + struct ReducedStateInfo { + Key key, pawnKey, materialKey; + int castleRights, rule50; + Square epSquare; + Value mgValue, egValue; + }; + + memcpy(&newSt, st, sizeof(ReducedStateInfo)); newSt.capture = NO_PIECE_TYPE; newSt.previous = st; st = &newSt; diff --git a/src/position.h b/src/position.h index bd59b5c9..8e29eb13 100644 --- a/src/position.h +++ b/src/position.h @@ -79,14 +79,15 @@ enum CastleRights { /// must be passed as a parameter. struct StateInfo { - Bitboard checkersBB; Key key, pawnKey, materialKey; int castleRights, rule50; Square epSquare; Value mgValue, egValue; + PieceType capture; - StateInfo* previous; + Bitboard checkersBB; Move lastMove; + StateInfo* previous; };