From 6f858b51d2578eb6f505fb5f2a05c1fefb47816f Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 3 May 2016 14:26:25 +0200 Subject: 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. --- gtk2_ardour/gui_object.h | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'gtk2_ardour/gui_object.h') diff --git a/gtk2_ardour/gui_object.h b/gtk2_ardour/gui_object.h index 39cf579fb5..16b43f31e3 100644 --- a/gtk2_ardour/gui_object.h +++ b/gtk2_ardour/gui_object.h @@ -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 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 all_ids () const; - static XMLNode* get_node (const XMLNode *, const std::string &); XMLNode* get_or_add_node (const std::string &); - static XMLNode* get_or_add_node (XMLNode *, const std::string &); - void remove_node (const std::string& id); + static XMLNode* get_node (const XMLNode *, const std::string &); + static XMLNode* get_or_add_node (XMLNode *, const std::string &); private: + XMLNode _state; + // ideally we'd use a O(1) hash table here, + // but O(log(N)) is fine already. + std::map object_map; }; - #endif /* __gtk_ardour_gui_object_h__ */ -- cgit v1.2.3