In this first benchmark I decided to try speeding up the parser by speeding up -[NSScanner scanJSONValue:]. I used the same strings as JSON::XS uses for its benchmarking. The things I tried were: * Firstly, reordering the calls in -[NSScanner scanJSONValue:] to scan for more common (from my subjective point of view) types first. * Further, I wanted to test whether skipping white space before successively trying to match each JSON type would yield a speedup. * Finally, I looked at the next character in the string and did dispatched directly to the correct type. Decoded short/long JSON strings per second (higher is better): | original | reordered | +skip ws | +dispatch | ------+-----------+-----------+----------+-----------| Short | 7468.818 | 7817.630 | 6381.824 | 7626.370 | Long | 110.255 | 117.472 | 106.309 | 110.573 | For the test data I used reordering calls yields a 4.6 to 6.5 percent increase in performance. The new order is approximately the reverse of the original. (The old order was chosen because the right edge of the calls made a pleasant curve, so an improvement here is not unexpected.) The test data has little optional white space, so skipping white space actually turns out to be slower. (Particularly so for short strings.) The white-space skipping is necessary for the dispatching logic. With that added the speed is it back up to about the same as the original. But now the code is uglier and there's more of it. It's my assumption that the performance of parsing human-readable JSON will matter less than the performance of parsing JSON meant for machine consumption. Given this assumption it makes sense to skip the white space skipping and dispatch table, as they make the code more complex.