I'd suggest using the elm optimisation of adding one byte on the end of your requests saying how much data you expect in response. That almost doubles the scanrate I see on my getups.
Also, upgrading the baudrate between your computer and your scantool can have highly positive effects.
Both of these optimisations are covered in detail in the ELM327 DataSheet.
For what it's worth, I'm seeing data rates upward of 40-50 PID/s on both my OBDLink and my OBDPro right now, enabling just those two large-scale optimisations. [The rate is probably actually higher - I'm just seeing 40-50 PID/s arriving in my logfile, but my app is single-threaded, so in the time it spends burning those PIDs to the log and looking up the GPS position might translate to another couple PIDs].