From: Steinar H. Gunderson Date: Wed, 3 Dec 2014 22:58:56 +0000 (+0100) Subject: Be lazier when parsing pretty moves. About 25% speedup in PGN parsing. X-Git-Url: https://git.sesse.net/?p=remoteglot;a=commitdiff_plain;h=cd07e136301429ab1f50027c78a9188799f1c9ae;hp=00caa4a350a597e9023675343374ace0836bdd92 Be lazier when parsing pretty moves. About 25% speedup in PGN parsing. --- diff --git a/Board.pm b/Board.pm index d2a6e0e..921de3d 100644 --- a/Board.pm +++ b/Board.pm @@ -148,6 +148,8 @@ sub move_to_uci_notation { return _pos_to_square($from_row, $from_col) . _pos_to_square($to_row, $to_col) . $promo; } +# Note: This is in general not a validation that the move is actually allowed +# (e.g. you can castle even though you're in check). sub parse_pretty_move { my ($board, $move, $toplay) = @_; @@ -192,14 +194,18 @@ sub parse_pretty_move { for my $col (0..7) { next if (defined($from_col) && $from_col != $col); next if ($board->[$row][$col] ne $piece); - next if (!$board->can_reach($piece, $row, $col, $to_row, $to_col)); - - # See if doing this move would put us in check - # (yes, there are clients that expect us to do this). - next if ($board->make_move($row, $col, $to_row, $to_col, $promo)->in_check($side)); push @squares, [ $row, $col ]; } } + if (scalar @squares > 1) { + # Filter out pieces which cannot reach this square. + @squares = grep { $board->can_reach($piece, $_->[0], $_->[1], $to_row, $to_col) } @squares; + } + if (scalar @squares > 1) { + # See if doing this move would put us in check + # (yes, there are clients that expect us to do this). + @squares = grep { !$board->make_move($_->[0], $_->[1], $to_row, $to_col, $promo)->in_check($side) } @squares; + } if (scalar @squares == 0) { die "Impossible move $move"; }