[Haskell-beginners] Optimise mininal date conversion function?

Daniel Fischer daniel.is.fischer at googlemail.com
Tue Jan 11 15:44:50 CET 2011


On Tuesday 11 January 2011 15:21:56, Patrick LeBoutillier wrote:
> Hi,
>
> I have this crude function that converts a date in YYYY/MM/DD format
> to an Int, but it's slow.
> Does any one have a clue on how to optimize it?

Try Data.ByteString[.Lazy].Char8.readInt

>
> date2int :: B.ByteString -> Int
> date2int b = y*12*31 + (m-1)*31 + (d-1)
>   where y = read . B.unpack . B.take 4 $ b
>         m = read . B.unpack . B.take 2 . B.drop 5 $ b
>         d = read . B.unpack . B.drop 8 $ b
>

date2int b0 = fromMaybe 0 $ do
    (y,b1) <- readInt b0
    (m,b2) <- readInt $ unsafeTail b1
    (d,_) <- readInt $ unsafeTail b2
    return $ y*12*31 + (m-1)*31 + (d-1)

(perhaps use bang-patterns, that may speed it up a bit [or not]).

>
> Here is the original C++ function that was ported:
>
> static unsigned date2int (const char *date){
>         return atoi(date)*12*31+(atoi(date+5)-1)*31+atoi(date+8)-1;
> }
>
>
> Thanks,
>
> Patrick




More information about the Beginners mailing list