diff options
author | Robin Gareus <robin@gareus.org> | 2017-03-27 04:59:20 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-03-27 04:59:20 +0200 |
commit | c3f2cff8bc5d017e16398fa6e0e9ca96155d831c (patch) | |
tree | 122ba137207c73dbd146a81ac0054ce7ce392a88 /gtk2_ardour/luainstance.cc | |
parent | 47ea6534d0ee1d55392f9866f14b638663a7daee (diff) |
optimize LuaInstance::get_action_state, LuaInstance::get_hook_state
Lua serialize() is called recursively and concatenates strings.
(in Lua that results in a new string on the stack, with 2 unused old
strings). Collecting garbage every time becomes expensive, so do it
only once at the end. GUI scripts are not memory limited anyway.
Diffstat (limited to 'gtk2_ardour/luainstance.cc')
-rw-r--r-- | gtk2_ardour/luainstance.cc | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/gtk2_ardour/luainstance.cc b/gtk2_ardour/luainstance.cc index b7963737cc..e83bef93ee 100644 --- a/gtk2_ardour/luainstance.cc +++ b/gtk2_ardour/luainstance.cc @@ -977,7 +977,6 @@ LuaInstance::init () "" " local function serialize (name, value)" " local rv = name .. ' = '" - " collectgarbage()" " if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then" " return rv .. basic_serialize(value) .. ' '" " elseif type(value) == \"table\" then" @@ -985,7 +984,6 @@ LuaInstance::init () " for k,v in pairs(value) do" " local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))" " rv = rv .. serialize(fieldname, v) .. ' '" - " collectgarbage()" // string concatenation allocates a new string " end" " return rv;" " elseif type(value) == \"function\" then" @@ -1600,7 +1598,15 @@ LuaCallback::get_state (void) luabridge::LuaRef savedstate ((*_lua_save)()); saved = savedstate.cast<std::string>(); } - lua.collect_garbage (); + + lua.collect_garbage (); // this may be expensive: + /* Editor::instant_save() calls Editor::get_state() which + * calls LuaInstance::get_hook_state() which in turn calls + * this LuaCallback::get_state() for every registered hook. + * + * serialize in _lua_save() allocates many small strings + * on the lua-stack, collecting them all may take a ms. + */ gchar* b64 = g_base64_encode ((const guchar*)saved.c_str (), saved.size ()); std::string b64s (b64); @@ -1676,7 +1682,6 @@ LuaCallback::init (void) "" " local function serialize (name, value)" " local rv = name .. ' = '" - " collectgarbage()" " if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then" " return rv .. basic_serialize(value) .. ' '" " elseif type(value) == \"table\" then" @@ -1684,7 +1689,6 @@ LuaCallback::init (void) " for k,v in pairs(value) do" " local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))" " rv = rv .. serialize(fieldname, v) .. ' '" - " collectgarbage()" // string concatenation allocates a new string " end" " return rv;" " elseif type(value) == \"function\" then" |