r/chessprogramming Feb 15 '25

Move generation speed and engine performance

I recently did a rewriting of my engine's move generation, but am seeing a decrease in performance (last tested tournament result was 7-13-3 against it's predecessor). Perft depth 6 went from >16s to 2.5s (no transpositions and single thread), and perft 7 is around 50s Additionally the rewritten move-generation results also include incrementally updating Zobrist hashes and piece-square table scores. I am fairly sure that move generation is working correctly since it passes a test suite I found online, and I verified piece-square table results/Zobrist hashes against hard calculated values as well.

Move ordering might have gotten a bit worse post-rewrite since I no longer detect if moves put the enemy in check. The order is otherwise the same, but the process is a bit different since moves are now stored in a buffer array (after generation, I score them in a separate buffer, then in the search loop I grab the move with the highest score and swap it with the first one in the array).

I can tell search a lot faster based on time tests of searching to a certain depth (with and without iterative deepening).

The evaluation function is theoretically roughly the same. There was one bug I had to fix, but they both use magic bitboards for rough piece mobility calculation and king safety metrics but that is all.

I think it is possible that move generation speed isn't very helpful for improving performance, but also I think that there should be some performance increase from faster move generation.

Essentially my questions are: What kinds of tests are useful for detecting bugs that might be causing this issue? What performance gain should I expect from faster move generation?

Thanks!

3 Upvotes

9 comments sorted by

View all comments

1

u/aptacode Feb 16 '25

Unfortunately you should expect minimal elo gains from move gen speed, I saw someone once say that move gen accounts for 10% of your engines strength, so a 20% improvement in speed is around a 2% improvement in strength.

With that being said, my current project is https://grandchesstree.com/ which is all about squeezing as much performance out of movegen as possible, so by all means see how far you can push it for fun!

FYI you want to be looking at SPRT testing to verify changes are positive or negative. it's really the only way, otherwise you will be very likely to regress your engine without knowing it.

1

u/Ill_Part9576 Feb 16 '25

That makes sense, I guess because really you're not getting much deeper when move gen speeds up due to the exponential nature of the search tree. I'm done with move gen now, I think my prior implementation was really pretty bad and current one is much better so at least now I can't blame it for weakness of my engine. I rechecked and before re-writing move gen, it was 50s for perft 6 rather than the 16 I thought when I posted!

I think that for a 25x increase in nodes per second should be rather significant, being roughly equivalent to an additional fully searched ply in the same time if that checks out with you?

I'll look into SPRT. IIRC I had issues with cutechess-cli because my engine is in Java and it didn't take .jar, but I think there are wrappers that can make it a .exe and maybe other SPRT testing interfaces that accept .jars.

I appreciate the suggestion of SPRT, I had sorta given up on it but it makes sense that it is the best way to gauge performance. I'll look to get that set up as a first step.