mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Optimize calls to get_path_kvp so that std::strings are not always created and deleted immediately.
Turns out that the on-the-fly conversion from const char* (the KVP_OPTION_PATH constants) to std::string with their immediate deletion afterwards is a quite costly operation. Avoiding this is surprisingly easy: Just keep local std::string objects at hand, and they don't have to be created and deleted anymore. The more optimized solution might be to turn the std::vector<std::string> into a std::vector<GQuark>, but this commit at least improves the picture for now.
This commit is contained in:
parent
4aaa18eafc
commit
1e3a445007
@ -128,6 +128,12 @@ qof_book_init (QofBook *book)
|
||||
book->version = 0;
|
||||
}
|
||||
|
||||
static const std::string str_KVP_OPTION_PATH(KVP_OPTION_PATH);
|
||||
static const std::string str_OPTION_SECTION_ACCOUNTS(OPTION_SECTION_ACCOUNTS);
|
||||
static const std::string str_OPTION_NAME_TRADING_ACCOUNTS(OPTION_NAME_TRADING_ACCOUNTS);
|
||||
static const std::string str_OPTION_NAME_AUTO_READONLY_DAYS(OPTION_NAME_AUTO_READONLY_DAYS);
|
||||
static const std::string str_OPTION_NAME_NUM_FIELD_SOURCE(OPTION_NAME_NUM_FIELD_SOURCE);
|
||||
|
||||
static void
|
||||
qof_book_get_property (GObject* object,
|
||||
guint prop_id,
|
||||
@ -142,32 +148,32 @@ qof_book_get_property (GObject* object,
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_OPT_TRADING_ACCOUNTS:
|
||||
qof_instance_get_path_kvp (QOF_INSTANCE (book), value, {KVP_OPTION_PATH,
|
||||
OPTION_SECTION_ACCOUNTS, OPTION_NAME_TRADING_ACCOUNTS});
|
||||
qof_instance_get_path_kvp (QOF_INSTANCE (book), value, {str_KVP_OPTION_PATH,
|
||||
str_OPTION_SECTION_ACCOUNTS, str_OPTION_NAME_TRADING_ACCOUNTS});
|
||||
break;
|
||||
case PROP_OPT_BOOK_CURRENCY:
|
||||
qof_instance_get_path_kvp (QOF_INSTANCE (book), value, {KVP_OPTION_PATH,
|
||||
OPTION_SECTION_ACCOUNTS, OPTION_NAME_BOOK_CURRENCY});
|
||||
qof_instance_get_path_kvp (QOF_INSTANCE (book), value, {str_KVP_OPTION_PATH,
|
||||
str_OPTION_SECTION_ACCOUNTS, OPTION_NAME_BOOK_CURRENCY});
|
||||
break;
|
||||
case PROP_OPT_DEFAULT_GAINS_POLICY:
|
||||
qof_instance_get_path_kvp (QOF_INSTANCE (book), value, {KVP_OPTION_PATH,
|
||||
OPTION_SECTION_ACCOUNTS, OPTION_NAME_DEFAULT_GAINS_POLICY});
|
||||
qof_instance_get_path_kvp (QOF_INSTANCE (book), value, {str_KVP_OPTION_PATH,
|
||||
str_OPTION_SECTION_ACCOUNTS, OPTION_NAME_DEFAULT_GAINS_POLICY});
|
||||
break;
|
||||
case PROP_OPT_DEFAULT_GAINS_ACCOUNT_GUID:
|
||||
qof_instance_get_path_kvp (QOF_INSTANCE (book), value, {KVP_OPTION_PATH,
|
||||
OPTION_SECTION_ACCOUNTS, OPTION_NAME_DEFAULT_GAINS_LOSS_ACCT_GUID});
|
||||
qof_instance_get_path_kvp (QOF_INSTANCE (book), value, {str_KVP_OPTION_PATH,
|
||||
str_OPTION_SECTION_ACCOUNTS, OPTION_NAME_DEFAULT_GAINS_LOSS_ACCT_GUID});
|
||||
break;
|
||||
case PROP_OPT_AUTO_READONLY_DAYS:
|
||||
qof_instance_get_path_kvp (QOF_INSTANCE (book), value, {KVP_OPTION_PATH,
|
||||
OPTION_SECTION_ACCOUNTS, OPTION_NAME_AUTO_READONLY_DAYS});
|
||||
qof_instance_get_path_kvp (QOF_INSTANCE (book), value, {str_KVP_OPTION_PATH,
|
||||
str_OPTION_SECTION_ACCOUNTS, str_OPTION_NAME_AUTO_READONLY_DAYS});
|
||||
break;
|
||||
case PROP_OPT_NUM_FIELD_SOURCE:
|
||||
qof_instance_get_path_kvp (QOF_INSTANCE (book), value, {KVP_OPTION_PATH,
|
||||
OPTION_SECTION_ACCOUNTS, OPTION_NAME_NUM_FIELD_SOURCE});
|
||||
qof_instance_get_path_kvp (QOF_INSTANCE (book), value, {str_KVP_OPTION_PATH,
|
||||
str_OPTION_SECTION_ACCOUNTS, str_OPTION_NAME_NUM_FIELD_SOURCE});
|
||||
break;
|
||||
case PROP_OPT_DEFAULT_BUDGET:
|
||||
qof_instance_get_path_kvp (QOF_INSTANCE (book), value, {KVP_OPTION_PATH,
|
||||
OPTION_SECTION_ACCOUNTS, OPTION_NAME_DEFAULT_BUDGET});
|
||||
qof_instance_get_path_kvp (QOF_INSTANCE (book), value, {str_KVP_OPTION_PATH,
|
||||
str_OPTION_SECTION_ACCOUNTS, OPTION_NAME_DEFAULT_BUDGET});
|
||||
break;
|
||||
case PROP_OPT_FY_END:
|
||||
qof_instance_get_path_kvp (QOF_INSTANCE (book), value, {"fy_end"});
|
||||
@ -198,32 +204,32 @@ qof_book_set_property (GObject *object,
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_OPT_TRADING_ACCOUNTS:
|
||||
qof_instance_set_path_kvp (QOF_INSTANCE (book), value, {KVP_OPTION_PATH,
|
||||
OPTION_SECTION_ACCOUNTS, OPTION_NAME_TRADING_ACCOUNTS});
|
||||
qof_instance_set_path_kvp (QOF_INSTANCE (book), value, {str_KVP_OPTION_PATH,
|
||||
str_OPTION_SECTION_ACCOUNTS, str_OPTION_NAME_TRADING_ACCOUNTS});
|
||||
break;
|
||||
case PROP_OPT_BOOK_CURRENCY:
|
||||
qof_instance_set_path_kvp (QOF_INSTANCE (book), value, {KVP_OPTION_PATH,
|
||||
OPTION_SECTION_ACCOUNTS, OPTION_NAME_BOOK_CURRENCY});
|
||||
qof_instance_set_path_kvp (QOF_INSTANCE (book), value, {str_KVP_OPTION_PATH,
|
||||
str_OPTION_SECTION_ACCOUNTS, OPTION_NAME_BOOK_CURRENCY});
|
||||
break;
|
||||
case PROP_OPT_DEFAULT_GAINS_POLICY:
|
||||
qof_instance_set_path_kvp (QOF_INSTANCE (book), value, {KVP_OPTION_PATH,
|
||||
OPTION_SECTION_ACCOUNTS, OPTION_NAME_DEFAULT_GAINS_POLICY});
|
||||
qof_instance_set_path_kvp (QOF_INSTANCE (book), value, {str_KVP_OPTION_PATH,
|
||||
str_OPTION_SECTION_ACCOUNTS, OPTION_NAME_DEFAULT_GAINS_POLICY});
|
||||
break;
|
||||
case PROP_OPT_DEFAULT_GAINS_ACCOUNT_GUID:
|
||||
qof_instance_set_path_kvp (QOF_INSTANCE (book), value, {KVP_OPTION_PATH,
|
||||
OPTION_SECTION_ACCOUNTS, OPTION_NAME_DEFAULT_GAINS_LOSS_ACCT_GUID});
|
||||
qof_instance_set_path_kvp (QOF_INSTANCE (book), value, {str_KVP_OPTION_PATH,
|
||||
str_OPTION_SECTION_ACCOUNTS, OPTION_NAME_DEFAULT_GAINS_LOSS_ACCT_GUID});
|
||||
break;
|
||||
case PROP_OPT_AUTO_READONLY_DAYS:
|
||||
qof_instance_set_path_kvp (QOF_INSTANCE (book), value, {KVP_OPTION_PATH,
|
||||
OPTION_SECTION_ACCOUNTS, OPTION_NAME_AUTO_READONLY_DAYS});
|
||||
qof_instance_set_path_kvp (QOF_INSTANCE (book), value, {str_KVP_OPTION_PATH,
|
||||
str_OPTION_SECTION_ACCOUNTS, str_OPTION_NAME_AUTO_READONLY_DAYS});
|
||||
break;
|
||||
case PROP_OPT_NUM_FIELD_SOURCE:
|
||||
qof_instance_set_path_kvp (QOF_INSTANCE (book), value, {KVP_OPTION_PATH,
|
||||
OPTION_SECTION_ACCOUNTS, OPTION_NAME_NUM_FIELD_SOURCE});
|
||||
qof_instance_set_path_kvp (QOF_INSTANCE (book), value, {str_KVP_OPTION_PATH,
|
||||
str_OPTION_SECTION_ACCOUNTS, str_OPTION_NAME_NUM_FIELD_SOURCE});
|
||||
break;
|
||||
case PROP_OPT_DEFAULT_BUDGET:
|
||||
qof_instance_set_path_kvp (QOF_INSTANCE (book), value, {KVP_OPTION_PATH,
|
||||
OPTION_SECTION_ACCOUNTS, OPTION_NAME_DEFAULT_BUDGET});
|
||||
qof_instance_set_path_kvp (QOF_INSTANCE (book), value, {str_KVP_OPTION_PATH,
|
||||
str_OPTION_SECTION_ACCOUNTS, OPTION_NAME_DEFAULT_BUDGET});
|
||||
break;
|
||||
case PROP_OPT_FY_END:
|
||||
qof_instance_set_path_kvp (QOF_INSTANCE (book), value, {"fy_end"});
|
||||
@ -1164,7 +1170,7 @@ static Path gslist_to_option_path (GSList *gspath)
|
||||
Path tmp_path;
|
||||
if (!gspath) return tmp_path;
|
||||
|
||||
Path path_v {KVP_OPTION_PATH};
|
||||
Path path_v {str_KVP_OPTION_PATH};
|
||||
for (auto item = gspath; item != nullptr; item = g_slist_next(item))
|
||||
tmp_path.push_back(static_cast<const char*>(item->data));
|
||||
if (tmp_path.front() == "counters")
|
||||
@ -1197,14 +1203,14 @@ qof_book_options_delete (QofBook *book, GSList *path)
|
||||
KvpFrame *root = qof_instance_get_slots(QOF_INSTANCE (book));
|
||||
if (path != nullptr)
|
||||
{
|
||||
Path path_v {KVP_OPTION_PATH};
|
||||
Path path_v {str_KVP_OPTION_PATH};
|
||||
Path tmp_path;
|
||||
for (auto item = path; item != nullptr; item = g_slist_next(item))
|
||||
tmp_path.push_back(static_cast<const char*>(item->data));
|
||||
delete root->set_path(gslist_to_option_path(path), nullptr);
|
||||
}
|
||||
else
|
||||
delete root->set_path({KVP_OPTION_PATH}, nullptr);
|
||||
delete root->set_path({str_KVP_OPTION_PATH}, nullptr);
|
||||
}
|
||||
|
||||
/* QofObject function implementation and registration */
|
||||
|
Loading…
Reference in New Issue
Block a user