From 76df6ec88fa65709381ab6e00a93cfaeb95fa749 Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Fri, 5 Dec 2008 03:31:45 +0000 Subject: [PATCH] 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 --- Ledger/Ledger.hs | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/Ledger/Ledger.hs b/Ledger/Ledger.hs index c3258a1bb..6858b203c 100644 --- a/Ledger/Ledger.hs +++ b/Ledger/Ledger.hs @@ -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.