[Haskell-cafe] Help with optimization
dons at galois.com
Sun Jul 20 20:28:47 EDT 2008
> Profiling says that my program spends 18.4 % of time (that is around
> three seconds) and 18.3 % of allocations in this function which is
> saving the rendered image to a PPM file:
> saveImageList :: String -> Int -> Int -> [ViewportDotColor] -> IO ()
> saveImageList filename width height image = do
> B.writeFile filename file
> where file = B.append header bytes
> header = C.pack $ "P6\n" ++ show width ++ " " ++ show height
> ++ "\n255\n"
> bytes = B.pack $ concatMap (color . dealpha .
> (\(ViewportDotColor _ c) -> c)) image
> where color (VoxelColor red green blue _) = [floor $ red *
> 255, floor $ green * 255, floor $ blue * 255]
> dealpha c = addColor c (VoxelColor 1.0 1.0 1.0 1.0)
> -- white background
> For a 921615 bytes large file to save this is too much in my opinion.
> And I think that it consumes to much allocations. Probably it should
> not store intermediate lists?
Rather than generating the bytes as a list and packing them, could you
instead fill a bytestring directly?
More information about the Haskell-Cafe