From eb9e45bc20531f936881d2433053716473b37828 Mon Sep 17 00:00:00 2001 From: Christian Stimming Date: Mon, 31 Dec 2018 14:48:26 +0100 Subject: [PATCH] Sorting speed-up: Cache the bool value of Transaction's is_closing property. This value is queried on each comparison of split or txn sort function, which means it is called quite a lot. Avoiding the KVP lookup of this property gains a lot in terms of CPU cycles. --- libgnucash/engine/Transaction.c | 23 ++++++++++++++++++----- libgnucash/engine/TransactionP.h | 5 +++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/libgnucash/engine/Transaction.c b/libgnucash/engine/Transaction.c index 1466834c32..a83bc48bef 100644 --- a/libgnucash/engine/Transaction.c +++ b/libgnucash/engine/Transaction.c @@ -273,6 +273,7 @@ gnc_transaction_init(Transaction* trans) trans->orig = NULL; trans->readonly_reason = NULL; trans->reason_cache_valid = FALSE; + trans->isClosingTxn_cached = -1; LEAVE (" "); } @@ -2195,9 +2196,13 @@ xaccTransSetIsClosingTxn (Transaction *trans, gboolean is_closing) g_value_init (&v, G_TYPE_INT64); g_value_set_int64 (&v, 1); qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, trans_is_closing_str); + trans->isClosingTxn_cached = 1; } else + { qof_instance_set_kvp (QOF_INSTANCE (trans), NULL, 1, trans_is_closing_str); + trans->isClosingTxn_cached = 0; + } qof_instance_set_dirty(QOF_INSTANCE(trans)); xaccTransCommitEdit(trans); } @@ -2353,12 +2358,20 @@ xaccTransGetNotes (const Transaction *trans) gboolean xaccTransGetIsClosingTxn (const Transaction *trans) { - GValue v = G_VALUE_INIT; if (!trans) return FALSE; - qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, trans_is_closing_str); - if (G_VALUE_HOLDS_INT64 (&v)) - return g_value_get_int64 (&v); - return FALSE; + if (trans->isClosingTxn_cached == -1) + { + Transaction* trans_nonconst = (Transaction*) trans; + GValue v = G_VALUE_INIT; + qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, trans_is_closing_str); + if (G_VALUE_HOLDS_INT64 (&v)) + trans_nonconst->isClosingTxn_cached = (g_value_get_int64 (&v) ? 1 : 0); + else + trans_nonconst->isClosingTxn_cached = 0; + } + return (trans->isClosingTxn_cached == 1) + ? TRUE + : FALSE; } /********************************************************************\ diff --git a/libgnucash/engine/TransactionP.h b/libgnucash/engine/TransactionP.h index 3679fb43e7..0c29a9209b 100644 --- a/libgnucash/engine/TransactionP.h +++ b/libgnucash/engine/TransactionP.h @@ -119,6 +119,11 @@ struct transaction_s */ char * readonly_reason; gboolean reason_cache_valid; + + /* Cached bool value to indicate whether this is a closing txn. This is + * cached from the KVP value because it is queried a lot. Tri-state value: -1 + * = uninitialized; 0 = FALSE, 1 = TRUE. */ + gint isClosingTxn_cached; }; struct _TransactionClass