| View previous topic :: View next topic |
| Author |
Message |
Sven Schüle
Joined: 15 May 2008 Posts: 2242 Location: Berlin, Germany
|
Post subject: Re: C# Performance Posted: Mon Feb 06, 2012 10:50 pm |
|
|
Hi Richard,
within AttackedByDark()/AttackedByLight() you are using an uncommon algorithm: you are going through all enemy piece lists, trying to find attacks from enemy pieces to the target square. The most common algorithm is different in that you start at the target square and watch out for enemy attacks in all directions from there, by assuming a "super piece" on the target square and taking all "outgoing" attacks of that super piece as "incoming" to the target square. That will save quite a lot of unnecessary work.
For knights and king this is not immediately obvious with your mailbox board (and in fact you might even take a hybrid approach by searching for knight and king attacks the way you do it now) but for sliders and pawns it should be a significant improvement to start at the target square since the effort for that is never bigger than the effort to find "outgoing" attacks for one queen and one pawn.
Testing for attacks to the target square of a castling rook (F1, D1, F8, D8) might even be done a tiny bit cheaper by writing specialized functions. For instance, for F1 you would only need these:
- attack by black queen or bishop on diagonals A6-E2 or G2-H3
- attack by black queen or rook on file F
- attack by black knight on D2/E3/G3/H2
- attack by black pawn on E2/G2
- attack by black king on G2 (everything else would already have been an illegal position before)
I don't know how big the speedup will be, if any, considering that castling availability is statistically rare so this code is rarely used. But at least it should be somehow measureable as long as AttackedByDark() etc. are very expensive operations.
A minor issue: MovePieceOnList(): in my opinion this function is missing a "break" for the "board.pceLst[index] == fromsq" case (fromsq should be unique in the piece list)
When making a move, you always check for "enemy king in check" immediately. This can be improved significantly by asking if the move you just made might really have been illegal. With normal pseudo-legal move generation, it is possible to restrict the set of potentially illegal moves like this:
1) check evasions,
2) king moves (including castles),
3) ep captures,
4) moves of pinned pieces (or weaker: moves of potentially pinned pieces).
Only these need the expensive "enemy king in check" test, other moves are legal unless you do something very extraordinary in move generation (which I am sure you don't do after looking into the code you posted). I made this proposal (which I did not invent, of course!) recently in a different thread opened by Folkert van Heusden.
In another recent thread I mentioned that checking for attacks to E1/E8 twice per color within castling move generation can be avoided, i.e. reduced to doing it only once per color, e.g. by introducing some "wereAttacksToE8Tested" flag. When maintaining an inCheck flag which is set at the top of each node (you'll do this anyway in regular search so why not in perft?), the whole "attacks to E1/E8" check can be skipped and replaced by testing the inCheck flag before generating castle moves.
As my last point, your piece list handling looks expensive to me. For instance, RemoveFromPieceList() loops through the list until it finds the slot to be removed. What if you spend a bit more of memory and store the piece list index for each square? This lets you find the right slot for Remove() immediately. Restoring a captured piece's square in the piece list when unmaking a capture move can be improved the same way if you additionally store the piece list index of the captured piece together with other "undo move" related information, like the captured piece type. You can then reinsert the square into the right slot by moving back the square that is currently in that slot beyond the current end of the list (where it came from, since you are unmaking a capture move where you had moved the square from the "end" position to the now empty slot!).
I don't know how much of a speed improvement you will get by implementing that last point about piece lists, which is also the reason why I mention it at the bottom of my post.
Sven |
|
| Back to top |
|
 |
|
| Subject |
Author |
Date/Time |
C# Performance |
Richard Allbert |
Fri Jan 27, 2012 8:41 pm |
Re: C# Performance |
Kevin Hearn |
Fri Jan 27, 2012 9:01 pm |
Re: C# Performance |
Richard Allbert |
Fri Jan 27, 2012 9:13 pm |
Re: C# Performance |
Gary |
Fri Jan 27, 2012 9:07 pm |
Re: C# Performance |
Richard Allbert |
Fri Jan 27, 2012 9:17 pm |
Re: C# Performance |
Gary |
Fri Jan 27, 2012 10:09 pm |
Re: C# Performance |
Mark Pearce |
Sat Jan 28, 2012 12:59 am |
Re: C# Performance |
Richard Allbert |
Sat Jan 28, 2012 8:44 am |
Re: C# Performance |
Sven Schüle |
Sat Jan 28, 2012 9:48 am |
Re: C# Performance |
Richard Allbert |
Sat Jan 28, 2012 10:25 am |
Re: C# Performance |
Richard Allbert |
Sat Jan 28, 2012 11:41 am |
Re: C# Performance |
Mark Pearce |
Sat Jan 28, 2012 11:44 am |
Re: C# Performance |
Richard Allbert |
Sat Jan 28, 2012 10:31 am |
Re: C# Performance |
Marco Costalba |
Sat Jan 28, 2012 1:09 pm |
Re: C# Performance |
Lucas Braesch |
Sat Jan 28, 2012 1:52 pm |
Re: C# Performance |
Richard Allbert |
Sat Jan 28, 2012 2:05 pm |
Re: C# Performance |
Marco Costalba |
Sat Jan 28, 2012 2:30 pm |
Re: C# Performance |
Richard Allbert |
Sat Jan 28, 2012 5:22 pm |
Re: C# Performance |
Sven Schüle |
Sat Jan 28, 2012 6:02 pm |
Re: C# Performance |
Richard Allbert |
Sat Jan 28, 2012 6:12 pm |
Re: C# Performance |
Robert Purves |
Sat Jan 28, 2012 10:17 pm |
Re: C# Performance |
Marco Costalba |
Sat Jan 28, 2012 10:25 pm |
Re: C# Performance |
Thomas Petzke |
Sat Jan 28, 2012 4:21 pm |
Re: C# Performance |
Richard Allbert |
Mon Jan 30, 2012 12:52 pm |
Re: C# Performance |
Marco Costalba |
Mon Jan 30, 2012 6:37 pm |
Re: C# Performance |
Richard Allbert |
Wed Feb 01, 2012 6:55 pm |
Re: C# Performance |
Marco Costalba |
Wed Feb 01, 2012 7:18 pm |
Re: C# Performance |
Mark Pearce |
Mon Jan 30, 2012 9:55 pm |
Re: C# Performance |
Richard Allbert |
Wed Feb 01, 2012 6:57 pm |
Re: C# Performance |
Mark Pearce |
Wed Feb 01, 2012 9:59 pm |
Re: C# Performance |
Mark Pearce |
Fri Feb 03, 2012 1:34 am |
Re: C# Performance |
Robert Purves |
Fri Feb 03, 2012 3:26 am |
Re: C# Performance |
Mark Pearce |
Fri Feb 03, 2012 9:28 am |
Re: C# Performance |
Sven Schüle |
Fri Feb 03, 2012 9:45 am |
Re: C# Performance |
Mark Pearce |
Sat Feb 04, 2012 7:57 pm |
Re: C# Performance |
Sven Schüle |
Sat Feb 04, 2012 10:36 pm |
Re: C# Performance |
Mark Pearce |
Sat Feb 04, 2012 11:49 pm |
Re: C# Performance |
Sven Schüle |
Sun Feb 05, 2012 12:51 am |
Re: C# Performance |
Mark Pearce |
Sun Feb 05, 2012 1:05 am |
Re: C# Performance |
Sven Schüle |
Fri Feb 03, 2012 10:04 am |
Re: C# Performance |
Mark Pearce |
Fri Feb 03, 2012 11:40 am |
Re: C# Performance |
Richard Allbert |
Sat Feb 04, 2012 7:10 pm |
Re: C# Performance |
Lucas Braesch |
Sat Feb 04, 2012 8:31 pm |
Re: C# Performance |
Mark Pearce |
Sat Feb 04, 2012 10:23 pm |
Re: C# Performance |
Mark Pearce |
Sun Feb 05, 2012 12:23 am |
Re: C# Performance |
Lucas Braesch |
Sun Feb 05, 2012 2:57 am |
Re: C# Performance |
Mark Pearce |
Sun Feb 05, 2012 11:40 am |
Re: C# Performance |
Richard Allbert |
Mon Feb 06, 2012 6:29 pm |
Re: C# Performance |
Richard Allbert |
Mon Feb 06, 2012 6:29 pm |
Re: C# Performance |
Richard Allbert |
Mon Feb 06, 2012 6:30 pm |
Re: C# Performance |
Richard Allbert |
Mon Feb 06, 2012 6:45 pm |
Re: C# Performance |
Gary |
Mon Feb 06, 2012 7:00 pm |
Re: C# Performance |
Richard Allbert |
Mon Feb 06, 2012 7:12 pm |
Re: C# Performance |
Sven Schüle |
Mon Feb 06, 2012 10:50 pm |
Re: C# Performance |
Richard Allbert |
Tue Feb 07, 2012 9:52 am |
Re: C# Performance |
Richard Allbert |
Tue Feb 07, 2012 9:53 am |
Re: C# Performance |
Richard Allbert |
Tue Feb 07, 2012 9:53 am |
Re: C# Performance |
Richard Allbert |
Tue Feb 07, 2012 9:54 am |
Re: C# Performance |
Mark Pearce |
Tue Feb 07, 2012 1:59 pm |
Re: C# Performance |
Richard Allbert |
Tue Feb 07, 2012 2:54 pm |
Re: C# Performance |
Richard Allbert |
Tue Feb 07, 2012 3:06 pm |
Re: C# Performance |
Mark Pearce |
Tue Feb 07, 2012 5:17 pm |
Re: C# Performance |
Richard Allbert |
Tue Feb 07, 2012 6:10 pm |
Re: C# Performance |
Richard Allbert |
Tue Feb 07, 2012 6:20 pm |
Re: C# Performance |
Mark Pearce |
Tue Feb 07, 2012 8:02 pm |
Re: C# Performance |
Richard Allbert |
Tue Feb 07, 2012 9:19 pm |
Re: C# Performance |
Mark Pearce |
Tue Feb 07, 2012 10:20 pm |
Re: C# Performance |
Richard Allbert |
Wed Feb 08, 2012 7:47 am |
Re: C# Performance |
Richard Allbert |
Wed Feb 08, 2012 7:57 am |
Re: C# Performance |
Sven Schüle |
Wed Feb 08, 2012 10:09 am |
Re: C# Performance |
Mark Pearce |
Wed Feb 08, 2012 12:16 pm |
Re: C# Performance |
Vincent Diepeveen |
Sat Feb 18, 2012 10:03 pm |
Re: C# Performance |
Mark Pearce |
Wed Feb 08, 2012 9:30 am |
Re: C# Performance |
Richard Allbert |
Wed Feb 08, 2012 12:02 pm |
Re: C# Performance |
Richard Allbert |
Wed Feb 08, 2012 12:34 pm |
Re: C# Performance |
Mark Pearce |
Wed Feb 08, 2012 12:56 pm |
Re: C# Performance |
Richard Allbert |
Wed Feb 08, 2012 1:18 pm |
Re: C# Performance |
Richard Allbert |
Wed Feb 08, 2012 2:30 pm |
Re: C# Performance |
Richard Allbert |
Wed Feb 08, 2012 2:34 pm |
Re: C# Performance |
Mark Pearce |
Wed Feb 08, 2012 3:02 pm |
Re: C# Performance |
Richard Allbert |
Wed Feb 08, 2012 3:27 pm |
Re: C# Performance |
Richard Allbert |
Wed Feb 08, 2012 3:29 pm |
Re: C# Performance |
Richard Allbert |
Wed Feb 08, 2012 3:59 pm |
Re: C# Performance |
Richard Allbert |
Wed Feb 08, 2012 4:04 pm |
Re: C# Performance |
Mark Pearce |
Wed Feb 08, 2012 6:07 pm |
Re: C# Performance |
Richard Allbert |
Thu Feb 09, 2012 10:41 am |
Re: C# Performance |
Mark Pearce |
Thu Feb 09, 2012 1:47 pm |
Re: C# Performance |
Richard Allbert |
Thu Feb 09, 2012 2:56 pm |
Re: C# Performance |
Mark Pearce |
Sat Feb 11, 2012 4:41 pm |
Re: C# Performance |
Richard Allbert |
Sun Feb 12, 2012 8:34 am |
Re: C# Performance |
Lucas Braesch |
Sun Feb 12, 2012 10:52 am |
Re: C# Performance |
Richard Allbert |
Sun Feb 12, 2012 12:26 pm |
Re: C# Performance |
Ron Murawski |
Mon Feb 13, 2012 5:26 am |
Re: C# Performance |
Lucas Braesch |
Mon Feb 13, 2012 5:52 am |
Re: C# Performance |
Richard Allbert |
Mon Feb 13, 2012 6:27 am |
Re: C# Performance |
Ron Murawski |
Tue Feb 14, 2012 6:38 am |
Re: C# Performance |
Lucas Braesch |
Tue Feb 14, 2012 8:22 am |
Re: C# Performance |
Mark Pearce |
Tue Feb 14, 2012 11:30 pm |
Re: C# Performance |
Richard Allbert |
Thu Feb 16, 2012 10:49 am |
Re: C# Performance |
Mark Pearce |
Sat Feb 18, 2012 12:34 pm |
Re: C# Performance |
Richard Allbert |
Mon Feb 20, 2012 9:19 pm |
Re: C# Performance |
Mark Pearce |
Tue Feb 21, 2012 8:33 am |
Re: C# Performance |
Richard Allbert |
Tue Feb 21, 2012 6:37 pm |
Re: C# Performance |
Vincent Diepeveen |
Sat Feb 18, 2012 10:19 pm |
Re: C# Performance |
Mark Pearce |
Sun Feb 12, 2012 2:01 pm |
Re: C# Performance |
Richard Allbert |
Sun Feb 12, 2012 4:40 pm |
Re: C# Performance |
Vincent Diepeveen |
Sat Feb 18, 2012 10:06 pm |
Re: C# Performance |
Mark Pearce |
Sun Feb 19, 2012 1:01 pm |
Re: C# Performance |
Vincent Diepeveen |
Sun Feb 19, 2012 5:25 pm |
Re: C# Performance |
Mark Pearce |
Sun Feb 19, 2012 7:04 pm |
Re: C# Performance |
Vincent Diepeveen |
Sun Feb 19, 2012 9:17 pm |
Re: C# Performance |
Mark Pearce |
Sun Feb 19, 2012 11:33 pm |
Re: C# Performance |
Richard Allbert |
Sun Feb 19, 2012 9:22 pm |
Re: C# Performance |
Vincent Diepeveen |
Sun Feb 19, 2012 9:32 pm |
Re: C# Performance |
Vincent Diepeveen |
Sun Feb 19, 2012 9:37 pm |
Re: C# Performance |
Vincent Diepeveen |
Sun Feb 19, 2012 10:06 pm |
Re: C# Performance |
Lucas Braesch |
Wed Feb 08, 2012 10:56 am |
Re: C# Performance |
Mark Pearce |
Wed Feb 08, 2012 11:30 am |
Re: C# Performance |
Richard Allbert |
Wed Feb 08, 2012 12:04 pm |
Re: C# Performance |
Tony Soares |
Tue Feb 07, 2012 3:47 am |
Re: C# Performance |
Richard Allbert |
Tue Feb 07, 2012 9:55 am |
Re: C# Performance |
Mark Pearce |
Sat Feb 04, 2012 8:37 pm |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|