Are you saying you expected this?:
catch event: sprite / next : 97.855
catch event: sprite / ended : 99.68
catch event: sprite / began : 0
catch event: sprite / next : 99.196
If so, that is a wrong understanding of how this works and how and when your measurement code runs.
~
First, By the time your script is running, all rendering for the current frame is done. No more rendering will occur till all scripts are done executing and control is handed back to Corona.
Second, when you call play(), it doesn’t do anything till the next rendering time (beginning of next frame).
Third, no events will be triggered till the began action takes effect.
Fourth, triggered events are processed by your scripts in the next available frame.
So, the delay 33.xxx ms you see is the time between when your script called play() and the next frame when the event listener printed the elapsed time till the began event got processed.
The began() call take effect between those two times (again, at the beginning of the frame in which the message is printed)
| Frame 10
| physics processing, internal stuff, rendering … SCRIPTS=> … play()called … FRAME ENDS
| Frame 11
| physics processing, internal stuff, rendering … SCRIPTS=> … sprite listener … FRAME ENDS
*/* play() takes effect somewhere in here
Note:… is time elapsing
PS - I might very well have this flip-flopped. SCRIPT PROCESSING MIGHT BE FIRST, THEN INTERNAL STUFF. The key takeaway is that they should be considered separated as two sub-parts of a frame.