packages feed

hanalyze-0.2.0.0: bench/haskell/BenchMemAggregate.hs

{-# LANGUAGE OverloadedStrings #-}
-- | Memory audit Q2-B: Preprocess.groupBy* aggregation.
--
-- Suspected bug: 'collectInOrder' uses O(n²) lookup + 'vs ++ [v]' per
-- element. n=10⁴ rows × small group count should already be slow.
--
-- Usage:
--   ./bench-mem-aggregate <n_rows> <n_groups>  +RTS -s -M256m
module Main where

import qualified Data.Text                as T
import qualified Data.Vector              as V
import qualified DataFrame.Internal.Column    as DX
import qualified DataFrame.Internal.DataFrame  as DX
import qualified DataFrame.Operations.Core     as DX
import           Data.Time.Clock          (getCurrentTime, diffUTCTime)
import           System.Environment       (getArgs)
import           System.IO                (hSetBuffering, BufferMode (..), stdout)

import qualified Hanalyze.DataIO.Preprocess as PP

main :: IO ()
main = do
  hSetBuffering stdout NoBuffering
  args <- getArgs
  let (n, ng) = case args of
        [a]    -> (read a :: Int, 10 :: Int)
        [a, b] -> (read a, read b)
        _      -> (10000, 10)
  putStrLn $ "BenchMemAggregate  n=" ++ show n ++ "  groups=" ++ show ng
  let groupCol = DX.fromList
                  ([ T.pack ("g" ++ show (i `mod` ng)) | i <- [0 .. n - 1] ] :: [T.Text])
      valCol   = DX.fromList
                  ([ sin (fromIntegral i / 7) :: Double | i <- [0 .. n - 1] ])
      df       = DX.insertColumn "g" groupCol
               $ DX.insertColumn "v" valCol DX.empty
  V.length (V.fromList [(0::Int)]) `seq` return ()  -- silence vector import
  t0 <- getCurrentTime
  let !res = PP.groupByMean "g" "v" df
  case res of
    Nothing -> putStrLn "  groupByMean returned Nothing!"
    Just r  -> putStrLn $ "  result rows=" ++ show (DX.dimensions r)
  t1 <- getCurrentTime
  putStrLn $ "  elapsed=" ++ show (diffUTCTime t1 t0)