So in 2.3 Blizzard introduced a system where you can send spell requests before your current spell is finished, this supposedly is going to create a game where /stopcasting macros aren't needed anymore, and that addons will not give you such a great advantage in DPS. The exact mechanics of how this works have been talked about, theorized, and debated. Sounds like a perfect subject for some hard research to me!
First we have to establish how the entire system seems to work. Using my addon set up to record every event and situation I can locate in spellcasting to identify steps in the process here is a simple timeline for a fireball cast:
2484418.8960 - Spell Cast Request sent for spell Fireball.
2484418.8980 - GCD started.
2484418.9930 - Start Cast Bar for spell Fireball predicted end at 2484421.993.
2484420.4140 - GCD cleared.
2484421.9930 - Predicted end of Fireball Cast Bar.
2484422.0360 - Stop Cast Bar for spell.
2484422.7380 - Spell success registered for Fireball.
Arranging this with the Cast Request as T+0.0000 we get:
0.0000 - Spell Cast Request sent for spell Fireball.
0.0020 - GCD started.
0.0970 - Start Cast Bar for spell Fireball predicted end at 2484421.993.
1.5180 - GCD cleared.
3.0970 - Predicted end of Fireball Cast Bar.
3.1400 - Stop Cast Bar for spell.
3.8420 - Spell success registered for Fireball.
So, the GCD starts 2 msec after the spell request, indicating that the GCD is initiated client side (things we already knew include).
The cast bar starts 97 msec later, my ping floats between 60-130 or so, so this indicates that the start of that cast bar has to be directed by the server, and is *not* synced to the event request, something I find odd.
The GCD clears at 1.518 seconds, noting that it was expected to clear at 1.502, this 16 msec delay is likey just UI delay, so the GCD would seem to also finish client side, so we aren't waiting on a GCD done event from the server.
The predicted end of the cast bar passes at 3.097 seconds, with an actual clear of the cast bar at 3.14 seconds, indicating that the server has to tell the client that the spell has finished. This makes sense, since it wants to hold out until the last moment for interrupt/pushbacks, and the server is the side that actually knows about those.
And at 3.842 seconds the actual spell damage event hits, thats a delta of 702 msec, this is fireball, so it has a missile time to take into account. Let's now take a look at a scorch cast for a zero-missile time sampling:
2484397.5420 - Spell Cast Request sent for spell Scorch.
2484397.5440 - GCD started.
2484397.7390 - Start Cast Bar for spell Scorch predicted end at 2484399.239.
2484399.0580 - GCD cleared.
2484399.2390 - Predicted end of Scorch Cast Bar.
2484399.2920 - Stop Cast Bar for spell.
2484399.3910 - Spell success registered for Scorch.
Same trend, 2msec for the GCD to start, 197 msec for the cast bar to start, 1.516 seconds to clear the GCD, 53 msec from the predicted end to the actual end, and spell success, and 99 msec from the end of the cast bar the damage event occurs.
So, overall we have an idea now of how we can observe the different events and how they fit together and where it is indicated teh server needs to authorize events. Server needs to tell you that you're starting casting, you're ending casting, and that your damage occured.
Now, lets do an example of casting a spell and trying to cast other spells while the cast bar is going:
2496975.8360 - Spell Cast Request sent for spell Pyroblast.
2496975.8370 - GCD started.
2496975.9680 - Start Cast Bar for spell Pyroblast predicted end at 2496981.968.
2496977.3400 - GCD cleared.
2496981.7840 - Spell Cast Request sent for spell Pyroblast.
2496981.7850 - GCD started.
2496981.8840 - GCD cleared.
2496981.9680 - Predicted end of Pyroblast Cast Bar.
2496981.9840 - Stop Cast Bar for spell.
2496982.5540 - Spell Cast Request sent for spell Pyroblast.
2496982.5560 - GCD started.
2496982.6860 - Start Cast Bar for spell Pyroblast predicted end at 2496988.686.
2496982.6880 - Spell success registered for Pyroblast.
2496984.0580 - GCD cleared.
So we request our cast, the GCD starts, the spell bar starts, the GCD clears, and we try to cast again, start our GCD again, and it clears 99 msec later, this is the game saying "no dummy, you can't cast yet!". We then request another spell, GCD Starts, the spell bar starts, the first pyro goes off, and the GCD clears. Next spellcast continues as above.
So, with all this we come up with a few interesting things that we can gather. Doing a few full rotations on Dr Boom with spamming of keys and careful timing and then parsing gives us some useful data. For anyone curious, because of the way floating point operations work timestamps with four decimal places of precision were returning differences out to an infinite level of precision (for details see
http://www.rocketaware.com/perl/perlfaq4/Why_am_I_getting_long_decimals_.htm for why it happens that way). I'm lazy, and just copy-pasted from my data sampling to four decimal places.
GCD Info:
Max GCD Observed: 1.5359
Min GCD Observed: 0.0979
The Max GCD is the longest time from the start of a cooldown to the end of a cooldown observed on the spell "Remove Lesser Curse". As shown it indicates that 1.5 seconds and processing delay is the highest value that GCD will return.
The Min GCD is the shortest time observed, this is for when you press a spell request before the system wants to accept one while you're casting and it starts ticking your GCD, but finishes early, this gives a good measurement of your ping time and the systems processing time.
Max Cast Times:
Scorch: 1.6049
Fireball: 3.2749
Pyroblast: 6.1160
These represent the highest time from the cast bar starting to it actually finishing, and give your actual cast times for the spells.
Min Cast Times:
Scorch: 1.5010
Fireball: 6.0019
Pyroblast: 3.0039
Same as above, but minimum.
Bar To Bar Min times:
Scorch: 1.4750
Fireball: 2.9569
Pyroblast: 5.9329
These represent the lowest time it took from the start of a spell cast before another cast bar started, and represent effectively our 'spam speed' of the spell. Of note is that these values are *lower* than the min cast time values for the spells, this occurs when a spell request is sent and the cast bar is started before the first ends. This would seem to be a system worked out by Blizzard to attempt to mitigate the lag factor.
Max delta from spell requests to ends:
Vs Observed End:
Scorch: 0.0320
Fireball: 0.1999
Pyroblast: 0.0049
Vs Predicted End:
Scorch: 0.0639
Fireball: 0.1310
Pyroblast: 0.0339
These represent the highest negative value from the observed and predicted ends of spells where a cast request was made and succeeded in generating a new cast. This is what we could call our "buffer" where you are able to successfully request a new spell.
What can we conclude from this? It looks like with propper timing you can get spells down to pretty much exactly their cast time, and even cheat your way under ever so slightly (about 40msec). Now, as far as exactly how to time this, to get those bare bar to bar min times I was using Quartz actually, so it would seem to still be a pretty good indication of when you should cast. This however will HURT your DPS if you're a button spammer like me, since you will incur those tiny GCDs, and if you are 10 msec before your window where you can request the spell and you start a 90 msecsec mini-GCD, you'll lose 80 msec of cast time.
So, blizzards change which was intended to make it so the masses wouldnt need an addon to be competative, failed, it just made the system a bit cleaner, and people who button spam (those who didnt do the /stopcasting, basically) still have a disadvantage vs those who dont.
And for the TL:DR crowd - The change to the spell cast system in 2.3 to eliminate /stopcasting macros does what they said it was going to do. Quartz is still the best way to go, you just dont need the /stopcasting macros.
Edit: Rearranged some data to have it with the right spell names.