mirror of
https://github.com/sockspls/badfish
synced 2025-05-01 09:13:08 +00:00
Use an homegrown insertion sort instead of std::sort()
It is stable and it is also a bit faster then std::sort() on the tipical small move lists that we need to handle. Verified to have same functionality of std::stable_sort() After 999 games at 1+0 Mod vs Orig +240 =534 -225 50.75% 507.0/999 +5 ELO Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
c1ea5ed6f7
commit
4dd7fccfd1
2 changed files with 26 additions and 7 deletions
22
src/move.h
22
src/move.h
|
@ -62,9 +62,29 @@ struct MoveStack {
|
||||||
int score;
|
int score;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Note that operator< is set up such that std::sort() will sort in descending order
|
// Note that operator< is set up such that sorting will be in descending order
|
||||||
inline bool operator<(const MoveStack& f, const MoveStack& s) { return s.score < f.score; }
|
inline bool operator<(const MoveStack& f, const MoveStack& s) { return s.score < f.score; }
|
||||||
|
|
||||||
|
// Our stable insertion sort in range [firstMove, lastMove), platform independent
|
||||||
|
template<typename T>
|
||||||
|
inline void sort_moves(T* firstMove, T* lastMove)
|
||||||
|
{
|
||||||
|
T value;
|
||||||
|
T *cur, *p, *d;
|
||||||
|
|
||||||
|
if (firstMove != lastMove)
|
||||||
|
for (cur = firstMove; ++cur != lastMove; )
|
||||||
|
{
|
||||||
|
p = d = cur;
|
||||||
|
value = *p--;
|
||||||
|
if (value < *p)
|
||||||
|
{
|
||||||
|
do *d = *p;
|
||||||
|
while (--d != firstMove && value < *--p);
|
||||||
|
*d = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////
|
////
|
||||||
//// Inline functions
|
//// Inline functions
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
//// Includes
|
//// Includes
|
||||||
////
|
////
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
#include "history.h"
|
#include "history.h"
|
||||||
|
@ -123,7 +122,7 @@ void MovePicker::go_next_phase() {
|
||||||
case PH_GOOD_CAPTURES:
|
case PH_GOOD_CAPTURES:
|
||||||
lastMove = generate_captures(pos, moves);
|
lastMove = generate_captures(pos, moves);
|
||||||
score_captures();
|
score_captures();
|
||||||
std::sort(moves, lastMove);
|
sort_moves(moves, lastMove);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case PH_KILLERS:
|
case PH_KILLERS:
|
||||||
|
@ -134,7 +133,7 @@ void MovePicker::go_next_phase() {
|
||||||
case PH_NONCAPTURES:
|
case PH_NONCAPTURES:
|
||||||
lastMove = generate_noncaptures(pos, moves);
|
lastMove = generate_noncaptures(pos, moves);
|
||||||
score_noncaptures();
|
score_noncaptures();
|
||||||
std::sort(moves, lastMove);
|
sort_moves(moves, lastMove);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case PH_BAD_CAPTURES:
|
case PH_BAD_CAPTURES:
|
||||||
|
@ -142,20 +141,20 @@ void MovePicker::go_next_phase() {
|
||||||
// to get SEE move ordering.
|
// to get SEE move ordering.
|
||||||
curMove = badCaptures;
|
curMove = badCaptures;
|
||||||
lastMove = lastBadCapture;
|
lastMove = lastBadCapture;
|
||||||
std::sort(badCaptures, lastMove);
|
sort_moves(badCaptures, lastMove);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case PH_EVASIONS:
|
case PH_EVASIONS:
|
||||||
assert(pos.is_check());
|
assert(pos.is_check());
|
||||||
lastMove = generate_evasions(pos, moves, pinned);
|
lastMove = generate_evasions(pos, moves, pinned);
|
||||||
score_evasions();
|
score_evasions();
|
||||||
std::sort(moves, lastMove);
|
sort_moves(moves, lastMove);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case PH_QCAPTURES:
|
case PH_QCAPTURES:
|
||||||
lastMove = generate_captures(pos, moves);
|
lastMove = generate_captures(pos, moves);
|
||||||
score_captures();
|
score_captures();
|
||||||
std::sort(moves, lastMove);
|
sort_moves(moves, lastMove);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case PH_QCHECKS:
|
case PH_QCHECKS:
|
||||||
|
|
Loading…
Add table
Reference in a new issue