I started poking at Yggdrasil’s lookup profile. On a longish game (I believe I’m still limiting the number of turns from when the game couldn’t end normally) it makes about seventy thousand value lookups, involving over two million calls up the parent-state chain, with an average lookup length of around 30.
As you can see, I also implemented some simple logging. It’s kind of interesting because you can follow the game a little: the sawtooth wave of turns, or where the deck got reshuffled. There’s also some variables which are obviously never being updated, just read at ever increasing depths. I’ve got some detail on which variables are being looked up frequently, and at what depth, which I’ll also be looking into at some point.
There are a couple of ways to attack this. I may look into compressing states at checkpoints, but that can only give a yet-to-be-determined constant multiplier. (which is still a constant multiplier on a big part of my execution speed) I tried implementing a primitive version of read-caching, which improved speed noticeably and dropped the average lookup depth to 1.8+.