This led me to the ‘Custom Lag Tolerance’ setting under ‘Interface Options | Combat’. If you recall, this was supposed to be Blizzard’s “response” to the /stopcasting macros of 3.0. I had mine set, as the tooltip suggests, to my general lag to the server, which is 50ms.
Once I disabled the custom lag tolerance (which reverts it to 400ms), my DPS went up by over 10% overall. Custom lag tolerance defines how soon before a GCD expires can you queue the next spell available. The problem with it being that you can’t “pre-cast” spells, so you have to cast them in real-time as your GCD becomes available. This would cause DPS losses whenever I would rotate spells (like applying DoTs and starting a cycle after each Eclipse proc). This also wouldn’t allow me to “pre-cast” Treants during a hardcast, I’d have to wait for the GCD to become available before I could drop them.
I don’t know why it took me so long to finally turn this off, but I’m glad I did.