[Haskell-cafe] Question regarding deepseq (Control.DeepSeq)
Frank Moore
frankmoore at math.cornell.edu
Thu Jun 24 21:19:44 EDT 2010
Thanks for the reply.
My main is now:
main = do
let as = [1..2e7] :: [Double]
start <- getCurrentTime
let meanAs = mean as
let meanOver2 = meanAs `deepseq` meanAs / 2
end <- getCurrentTime
putStrLn (show (end `diffUTCTime` start))
start <- getCurrentTime
putStrLn (show meanOver2)
end <- getCurrentTime
putStrLn (show (end `diffUTCTime` start))
The time is still spent on the show meanOver2 command :(
Frank
On Thu, Jun 24, 2010 at 9:11 PM, Ivan Miljenovic
<ivan.miljenovic at gmail.com>wrote:
> On 25 June 2010 10:57, Frank Moore <fmoore at gmail.com> wrote:
> > Hello Haskellers,
> >
> > I am new to programming in Haskell and I am having trouble understanding
> > exactly when statements become evaluated. My goal is to try and measure
> how
> > long a computation takes without having to use a show function. The code
> I
> > am trying to use is below (taken in part from RWH chapter 25)
> >
> > ----------------------------------
> > import Data.List (foldl')
> > import Data.Time.Clock (diffUTCTime, getCurrentTime)
> > import Control.DeepSeq (deepseq)
> >
> > mean :: [Double] -> Double
> > mean xs = s / fromIntegral n where
> > (n,s) = foldl' k (0,0) xs
> > k (n,s) x = n `seq` s `seq` (n+1,s+x)
> >
> > main = do
> > let as = [1..1e7] :: [Double]
> > start <- getCurrentTime
> > let meanOver2 = deepseq (mean as) `seq` (mean as) / fromIntegral 2
> > end <- getCurrentTime
> > putStrLn (show (end `diffUTCTime` start))
> > putStrLn (show meanOver2)
> > -------------------------------------
> >
> > My understanding of deepseq was that it evaluates (mean as) completely
> > before continuing, and then the show would not take any time, but instead
> > all the time is spent in the show meanOver2 function. I feel like I am
> > missing something fundamental here. Any suggestions? Thanks for your
> help.
>
> It does... but because you don't save the result it doesn't keep the
> result (you're wanting Common Sub-expression Elimination, which GHC
> doesn't do).
>
> Try this:
>
> let meanAs = mean as
> meanOver2 = meanAs `deepSeq` meanAs / 2
>
> Note that your usage of "fromIntegral" isn't required, as that is
> automatically done for any integral literal (but if you had 2 in an
> Int variable then you would need fromIntegral).
>
>
> --
> Ivan Lazar Miljenovic
> Ivan.Miljenovic at gmail.com
> IvanMiljenovic.wordpress.com
>
--
Dr. W. Frank Moore
H. C. Wang Assistant Professor
Department of Mathematics, Cornell University
310 Malott Hall, Ithaca NY 14853-4201, USA
Office: Malott 587, Phone: +1 607 255 4030
Email: frankmoore at math.cornell.edu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20100624/1cc06c09/attachment-0001.html
More information about the Haskell-Cafe
mailing list