optimise cacheLedger by using the tree to help calculate account balances

from:

	total time  =        0.14 secs   (7 ticks @ 20 ms)
	total alloc = 275,520,536 bytes  (excludes profiling overheads)

     cacheLedger                                     1   0.0    0.1      42.9       48.6
      sumTransactions                                0   0.0    0.6      28.6       42.5
       isZeroAmount                              13529   0.0    2.0      14.3       39.2
        showAmount                               13529   0.0    7.2      14.3       37.2
         showAmount'                             13529  14.3   29.9      14.3       29.9
         con2tag_Side#                           27232   0.0    0.0       0.0        0.0
       normaliseMixedAmount                       6733   0.0    1.8      14.3        2.7
        con2tag_Side#                              120   0.0    0.0       0.0        0.0
        sumAmountsPreservingPrice                 6803   0.0    0.2      14.3        1.0
         amountop                                13351   0.0    0.4      14.3        0.8
          convertAmountTo                        13351  14.3    0.4      14.3        0.4
           conversionRate                        13351   0.0    0.0       0.0        0.0
      isAccountNamePrefixOf                      25122   0.0    2.0       0.0        2.0

to:

	total time  =        0.08 secs   (4 ticks @ 20 ms)
	total alloc = 168,637,964 bytes  (excludes profiling overheads)

     cacheLedger                                     1   0.0    0.1       0.0       27.1
      sumTransactions                                0   0.0    0.3       0.0       18.8
       isZeroAmount                               3931   0.0    0.9       0.0       17.3
        showAmount                                3931   0.0    3.4       0.0       16.3
         showAmount'                              3931   0.0   12.9       0.0       12.9
         con2tag_Side#                            7884   0.0    0.0       0.0        0.0
       normaliseMixedAmount                       1964   0.0    0.8       0.0        1.3
        con2tag_Side#                               12   0.0    0.0       0.0        0.0
        sumAmountsPreservingPrice                 1970   0.0    0.1       0.0        0.5
         amountop                                 3793   0.0    0.2       0.0        0.4
          convertAmountTo                         3793   0.0    0.2       0.0        0.2
           conversionRate                         3793   0.0    0.0       0.0        0.0
This commit is contained in:
Simon Michael 2008-12-05 03:31:45 +00:00
parent b1f2d95e13
commit 76df6ec88f

View File

@ -35,15 +35,26 @@ cacheLedger apats l = Ledger{rawledgertext="",rawledger=l,accountnametree=ant,ac
where
ts = filtertxns apats $ rawLedgerTransactions l
ant = rawLedgerAccountNameTree l
anames = flatten ant
txnmap = Map.union (transactionsByAccount ts) (Map.fromList [(a,[]) | a <- anames])
subacctsof a = filter (a `isAccountNamePrefixOf`) anames
subtxnsof a = concat [txnmap ! a | a <- [a] ++ subacctsof a]
balmap = Map.union
(Map.fromList [(a,sumTransactions $ subtxnsof a) | a <- anames])
(Map.fromList [(a,Mixed []) | a <- anames])
txnsof = (txnmap !)
-- add subaccount-including balances to a tree of account names
-- somewhat efficiently
addbalances :: Tree AccountName -> Tree (AccountName, MixedAmount)
addbalances (Node a []) = Node (a,sumTransactions $ txnsof a) []
addbalances (Node a subs) = Node (a,sumtxns + sumsubaccts) subbals
where
sumtxns = sumTransactions $ txnsof a
sumsubaccts = sum $ map (snd . root) subbals
subbals = map addbalances subs
balmap = Map.fromList $ flatten $ addbalances ant
balof = (balmap !)
mkacct a = Account a (txnsof a) (balof a)
acctmap = Map.fromList [(a, mkacct a) | a <- anames]
mkacct a = Account a (txnmap ! a) (balmap ! a)
-- | Convert a list of transactions to a map from account name to the list
-- of all transactions in that account.