This answer is seen from a memory perspective, as that can also be considered performance :-P.
I just implemented parsing of a 70KB JSON file in Android, parsing an array of objects which should either load from scratch or update previously present data binding objects, all over HTTP.
The biggest drawback with the built-in org.json package for android runtime 3 was
- the JSONTokener constructor only accepts a String, no Reader
- the lack of practical support for pull-parsing
This typically means you need to keep the whole file in memory (think 2x byte size) and in addition hold all the resulting JSON objects in memory at the same time, before you start making your data binding. So worst case is 2x file size, JSON objects and data-binding objects - usually at least 2x the memory requirement.
If you pull-parse from a reader, you can get this down to 1x. That is the most important thing you can do from memory perspective.
And, surprise surprise, if you go with some more modern classes, like Jackson or just the latest sources from org.json, you will be able to get around both these constraints without a problem, a later android runtime also seems to have some utility classes for JSON pull-parsing.
If you are stuck with an old runtime, and want to keep the footprint of the application down, as did I, you can copy the JSONTokener from org.json and modify your top level parse loop (in my case the array parse loop) and do data binding on each member of the array instead of the whole array at once. This way you reuse the JSON objects already in the android runtime as much as possible and still get the streaming effect (at the price of adding ids to each top-level object).