I'm looking through the code and there's something I'm slightly unsure of. It seems you're executing the timers between select returns, which is fair enough, but it looks like your select timeout is almost always 1 second. Now I might be wrong on this (it's very likely, as I don't know the codebase or PHP), but wouldn't that mean your timers can only be fired at minimum once a second? From looking at T3's output it's likely that the timer is always elapsing after one second, which would bare my theory out. If I'm not wrong then you could try putting the select timeout to a very low value, such as a 0.01 seconds or something, basically just enough to prevent it from flooding the CPU. pyinsim uses select as well and in that I use a timeout of 0.05 seconds, but this is a pretty arbitrary value that I came to after a discussion on StackOverflow. I could of course be completely wrong about all of this, in which case just slap me with a big fish.
No point adding them until the new patch is out, as it'll have to be tested, also hard to know the ins-and-outs without an updated InSim.txt. I've put the new packets into InSim.NET, but personally not going to release it until I have a chance to test it.