speed up track creation

For every added Trackview/Mixerstrip, Ardour looks up GUI properties which
results in a total of 13 calls for the initial default items per track:
("height", "visible", "layer-display", "strip-width")

Since the tracks don't yet exist, the properties don't either.
Every lookup result in iterating over all all XMLNotes and for every
"Object". ->property ("id") and ->value () allocates memory.

Adding 64 tracks to an empty session results in 528293 string
allocations and deallocations in XMLNode::property() taking ~30%
of the track creation time.

This commit XMLnode's const method to prevent memory allocation
and caches a pointer to the XMLNode* to skip iterating over object
state.
This commit is contained in:
Robin Gareus 2016-05-03 14:26:25 +02:00
parent 255b5174c4
commit 6f858b51d2
2 changed files with 61 additions and 52 deletions

View file

@ -33,12 +33,18 @@ class GUIObjectState
public:
GUIObjectState ();
XMLNode& get_state () const;
int set_state (const XMLNode&);
static const std::string xml_node_name;
void load (const XMLNode&);
int set_state (const XMLNode&);
XMLNode& get_state () const;
/** Get a string from our state.
* @param id property of Object node to look for.
* @param prop_name name of the Object property to return.
* @param empty if non-0, filled in with true if the property is currently non-existant, otherwise false.
* @return value of property `prop_name', or empty.
*/
std::string get_string (const std::string& id, const std::string& prop_name, bool* empty = 0);
template<typename T> void set_property (const std::string& id, const std::string& prop_name, const T& val) {
@ -48,17 +54,23 @@ public:
child->add_property (prop_name.c_str(), s.str());
}
/** Remove node with provided id.
* @param id property of Object node to look for.
*/
void remove_node (const std::string& id);
std::list<std::string> all_ids () const;
static XMLNode* get_node (const XMLNode *, const std::string &);
XMLNode* get_or_add_node (const std::string &);
static XMLNode* get_node (const XMLNode *, const std::string &);
static XMLNode* get_or_add_node (XMLNode *, const std::string &);
void remove_node (const std::string& id);
private:
XMLNode _state;
// ideally we'd use a O(1) hash table here,
// but O(log(N)) is fine already.
std::map <std::string, XMLNode*> object_map;
};
#endif /* __gtk_ardour_gui_object_h__ */