mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-08 07:45:00 +01:00
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:
parent
255b5174c4
commit
6f858b51d2
2 changed files with 61 additions and 52 deletions
|
|
@ -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__ */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue