[Haskell-cafe] Performance Issue
Daniel Fischer
daniel.is.fischer at web.de
Sat May 22 10:48:27 EDT 2010
On Saturday 22 May 2010 15:00:25, Thomas Schilling wrote:
> Actually, in this case it would be safe to do CSS. Because
>
> a) the function is strict in both arguments so GHC creates a worker
> which only uses unboxed types
> b) this cannot cause any space leaks (it contains no pointers)
>
> The generated Core does look pretty weird, though:
>
> $wnewton =
> \ (ww_s115 :: Double#) (ww1_s119 :: Int#) ->
> case ww1_s119 of ds_Xr8 {
> __DEFAULT ->
> case ^_r11D
> (case $wnewton ww_s115 (-# ds_Xr8 1)
> of ww2_s11d { __DEFAULT ->
> D# ww2_s11d -- box the result of $wnewton
> })
> lvl_r11B
> of _ { D# x_avk -> -- unbox it again
The boxing is due to the use of (^).
If you write x*x instead of x^2, it can use the primop *## and needn't box
it.
As a side effect, the original time leak probably wouldn't have occured
with x*x instead of x^2 because one would've made it
let x = newton a (n-1) in (x*x +a) / (2*x)
instead of writing out newton a (n-1) thrice anyway, wouldn't one?
> case $wnewton ww_s115 (-# ds_Xr8 1)
> of ww2_s11d { __DEFAULT ->
> /##
> (+## x_avk ww_s115) (*## 2.0 ww2_s11d)
> }
> };
> 0 -> ww_s115
> }
>
More information about the Haskell-Cafe
mailing list