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.
This commit is contained in:
Christian Stimming 2018-12-31 14:48:26 +01:00
parent 1eed3db5e7
commit eb9e45bc20
2 changed files with 23 additions and 5 deletions

View File

@ -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;
}
/********************************************************************\

View File

@ -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