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->orig = NULL;
trans->readonly_reason = NULL; trans->readonly_reason = NULL;
trans->reason_cache_valid = FALSE; trans->reason_cache_valid = FALSE;
trans->isClosingTxn_cached = -1;
LEAVE (" "); LEAVE (" ");
} }
@@ -2195,9 +2196,13 @@ xaccTransSetIsClosingTxn (Transaction *trans, gboolean is_closing)
g_value_init (&v, G_TYPE_INT64); g_value_init (&v, G_TYPE_INT64);
g_value_set_int64 (&v, 1); g_value_set_int64 (&v, 1);
qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, trans_is_closing_str); qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, trans_is_closing_str);
trans->isClosingTxn_cached = 1;
} }
else else
{
qof_instance_set_kvp (QOF_INSTANCE (trans), NULL, 1, trans_is_closing_str); qof_instance_set_kvp (QOF_INSTANCE (trans), NULL, 1, trans_is_closing_str);
trans->isClosingTxn_cached = 0;
}
qof_instance_set_dirty(QOF_INSTANCE(trans)); qof_instance_set_dirty(QOF_INSTANCE(trans));
xaccTransCommitEdit(trans); xaccTransCommitEdit(trans);
} }
@@ -2353,12 +2358,20 @@ xaccTransGetNotes (const Transaction *trans)
gboolean gboolean
xaccTransGetIsClosingTxn (const Transaction *trans) xaccTransGetIsClosingTxn (const Transaction *trans)
{ {
GValue v = G_VALUE_INIT;
if (!trans) return FALSE; if (!trans) 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); qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, trans_is_closing_str);
if (G_VALUE_HOLDS_INT64 (&v)) if (G_VALUE_HOLDS_INT64 (&v))
return g_value_get_int64 (&v); trans_nonconst->isClosingTxn_cached = (g_value_get_int64 (&v) ? 1 : 0);
return FALSE; 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; char * readonly_reason;
gboolean reason_cache_valid; 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 struct _TransactionClass