1
0
Fork 0
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:
Marco Costalba 2009-10-15 13:08:39 +02:00
parent c1ea5ed6f7
commit 4dd7fccfd1
2 changed files with 26 additions and 7 deletions

View file

@ -62,9 +62,29 @@ struct MoveStack {
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; }
// 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

View file

@ -23,7 +23,6 @@
//// Includes
////
#include <algorithm>
#include <cassert>
#include "history.h"
@ -123,7 +122,7 @@ void MovePicker::go_next_phase() {
case PH_GOOD_CAPTURES:
lastMove = generate_captures(pos, moves);
score_captures();
std::sort(moves, lastMove);
sort_moves(moves, lastMove);
return;
case PH_KILLERS:
@ -134,7 +133,7 @@ void MovePicker::go_next_phase() {
case PH_NONCAPTURES:
lastMove = generate_noncaptures(pos, moves);
score_noncaptures();
std::sort(moves, lastMove);
sort_moves(moves, lastMove);
return;
case PH_BAD_CAPTURES:
@ -142,20 +141,20 @@ void MovePicker::go_next_phase() {
// to get SEE move ordering.
curMove = badCaptures;
lastMove = lastBadCapture;
std::sort(badCaptures, lastMove);
sort_moves(badCaptures, lastMove);
return;
case PH_EVASIONS:
assert(pos.is_check());
lastMove = generate_evasions(pos, moves, pinned);
score_evasions();
std::sort(moves, lastMove);
sort_moves(moves, lastMove);
return;
case PH_QCAPTURES:
lastMove = generate_captures(pos, moves);
score_captures();
std::sort(moves, lastMove);
sort_moves(moves, lastMove);
return;
case PH_QCHECKS: