История изменений
Исправление 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