mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
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:
@@ -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;
|
||||||
qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, trans_is_closing_str);
|
if (trans->isClosingTxn_cached == -1)
|
||||||
if (G_VALUE_HOLDS_INT64 (&v))
|
{
|
||||||
return g_value_get_int64 (&v);
|
Transaction* trans_nonconst = (Transaction*) trans;
|
||||||
return FALSE;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************\
|
/********************************************************************\
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user