LINUX.ORG.RU

История изменений

Исправление qnikst, (текущая версия) :

блин как вы на этом пишите?!

{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
import Data.Vector.Unboxed as U
import Data.Foldable as F
import Data.Array.Repa.IO.Timing
import Control.Exception

size = 1000000;

-- Transform
data Transform = Transform Double Double Double Double

transform2d x y z = Transform (cos x) (sin x) y z

-- Vector
type V = (Double, Double)

mult :: Transform -> V -> V
mult (Transform cs ss x y) (vx,vy) = (vx*cs - vy*ss+x, vy*cs+vx*ss+y)

add :: V -> V -> V
add (vx1,vy1) (vx2,vy2) = (vx1+vx2, vy1+vy2)

main = do
    let vec = U.generate size (\i -> let d = (fromIntegral i)/(fromIntegral size) in (d,d))
        tf = transform2d 1 (-2.5) 5
    let repeat = 1000;
    (v,t) <- time$ replicateM repeat $ evaluate $ U.foldr1' (\y x -> x `add` (mult tf) y) vec
    putStr $ prettyTime t

----
qnikst@thinkpad ~/tmp/lor/2d $ ./1 
elapsedTimeMS   = 85
cpuTimeMS       = 80

Исправление qnikst, :

блин как вы на этом пишите?!

{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
import Data.Vector.Unboxed as U
import Data.Foldable as F
import Data.Array.Repa.IO.Timing
import Control.Exception

size = 1000000;

-- Transform
data Transform = Transform Double Double Double Double

transform2d x y z = Transform (cos x) (sin x) y z

-- Vector
type V = (Double, Double)

mult :: Transform -> V -> V
mult (Transform cs ss x y) (vx,vy) = (vx*cs - vy*ss+x, vy*cs+vx*ss+y)

add :: V -> V -> V
add (vx1,vy1) (vx2,vy2) = (vx1+vx2, vy1+vy2)

main = do
    let vec = U.generate size (\i -> let d = (fromIntegral i)/(fromIntegral size) in (d,d))
        tf = transform2d 1 (-2.5) 5
    let repeat = 1000;
    (v,t) <- time$ replicateM repeat $ evaluate $ U.foldr1' (\y x -> x `add` (mult tf) y) vec
    putStr $ prettyTime t

----
qnikst@thinkpad ~/tmp/lor/2d $ ./1 
elapsedTimeMS   = 85
cpuTimeMS       = 80

Исходная версия qnikst, :

блин как вы на этом пишите?!

{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
import Data.Vector.Unboxed as U
import Data.Foldable as F
import Data.Array.Repa.IO.Timing
import Control.Exception

size = 1000000;

-- Transform
data Transform = Transform Double Double Double Double

transform2d x y z = Transform (cos x) (sin x) y z

-- Vector
type V = (Double, Double)

mult :: Transform -> V -> V
mult (Transform cs ss x y) (vx,vy) = (vx*cs - vy*ss+x, vy*cs+vx*ss+y)

zero = (0, 0)

add :: V -> V -> V
add (vx1,vy1) (vx2,vy2) = (vx1+vx2, vy1+vy2)


main = do
    let vec = U.generate size (\i -> let d = (fromIntegral i)/(fromIntegral size) in (d,d))
        tf = transform2d 1 (-2.5) 5
    let repeat = 1000;
    (v,t) <- time$ replicateM repeat $ evaluate $ U.foldr1' (\y x -> x `add` (mult tf) y) vec
    putStr $ prettyTime t

----
qnikst@thinkpad ~/tmp/lor/2d $ ./1 
elapsedTimeMS   = 85
cpuTimeMS       = 80