Provide a faster implementation for the Read Integer instance
authorMarios Titas <redneb@gmx.com>
Mon, 23 Feb 2015 12:46:25 +0000 (06:46 -0600)
committerAustin Seipp <austin@well-typed.com>
Mon, 23 Feb 2015 12:46:26 +0000 (06:46 -0600)
commita5a4c25626e11e8b4be6687a9af8cfc85a77e9ba
treefc4c06de47c13a10872a3650de686500f41d15c4
parent4f467b2e57ee3060d158a6505873df8c75b38c5c
Provide a faster implementation for the Read Integer instance

Summary:
The current implementation of the Read Integer instance has quadratic
complexity and thus performs badly on large inputs. This patch provides a
rather simple sub-quadratic algorithm. For small inputs, we use the old
algorithm (there is a small penalty for that). The gains for large
inputs can be dramatic: on my system, the time to perform
    read (take 1000000 $ cycle "1234567890") :: Integer
drops from 65 seconds to less than a second.

Note that we already provide an ad-hoc instance for Show Integer, so this
patch essentially does the same thing for Read Integer.

Test Plan: Check that read :: String -> Integer returns correct results for inputs of various sizes.

Reviewers: austin, hvr

Reviewed By: austin, hvr

Subscribers: ekmett, thomie

Differential Revision: https://phabricator.haskell.org/D645

GHC Trac Issues: #10067
libraries/base/Text/Read/Lex.hs