mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-08 07:02:44 +03:00
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:
parent
b1f2d95e13
commit
76df6ec88f
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user