Someone told me that its a poorly designed function that sends a request and waits for a reply, suffering user-level Windows scheduling latency plus the tiny amount of time the A/D converter actually requires to make the measurement!. I thought it might be the appropriate place to discuss matlab programming but am sorry if its not the place.
Yes, but 104 µS per read doesn't translate into 21 reads per second. More like 9615 reads per second.
It's not poorly designed, it is designed to block, that's all. For beginners (towards who the Arduino is targeted) to handle non-blocking functions would be a big ask. So, they make them wait the 104 µS instead. And that is actually the time taken to make the measurement, it isn't extra on top of that.
You can write it in a non-blocking way (my page on interrupts shows how).