I really didn't expect mapAccumL to have quadratic complexity. Thank you a
lot for the fix!


On Mon, Sep 13, 2010 at 5:06 AM, Bryan O'Sullivan <b...@serpentine.com>wrote:

> On Sun, Sep 12, 2010 at 12:23 PM, Petr Prokhorenkov <
> prokhoren...@gmail.com> wrote:
>
>> I experienced a following problem while dealing with some text processing.
>>
>
> Thanks for the report and the test case. There's nothing wrong with your
> code - read on for details.
>
> You ran into one of the few functions in Data.Text that I copied straight
> over from the list implementation due to it not being used often.
> Unfortunately, that implementation constructs a new Text value (using cons)
> on every iteration through the loop, and as you might expect that's very
> slow even on tiny inputs, as it has quadratic behaviour.
>
> I've rewritten both strict and lazy mapAccumL and mapAccumR to use as much
> of the stream fusion machinery as possible. (By the way, there's an
> interesting fact behind why those functions started out life as they did:
> you can't write mapAccum functions using only stream machinery, due to their
> types, and the strict code is more work to write if you can't use the stream
> machinery. In the early days it just wasn't worth writing the more complex
> variants of them, as I had more pressing performance concerns at the time.)
>
> Where the old version of mapAccumL caused your test case to take 5 seconds
> to process an 11KB file (ouch!), with the rewritten version, your code can
> process an 81MB file in the same amount of time, without any changes to your
> code, and that O(n^2) behaviour is gone :-)
>
> text 0.8.1.0 is now up on hackage, with the fix included. Enjoy!
>
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to