[Tarantool-patches] [PATCH] lua: lua_field_inspect_table without pushcfunction
Sergey Kaplun
skaplun at tarantool.org
Tue May 19 13:29:24 MSK 2020
Hi! Thanks for the review!
On 18.05.20, Vladislav Shpilevoy wrote:
> On 18/05/2020 11:37, Sergey Kaplun wrote:
> > Currently on encoding table we push cfunction (lua_field_try_serialize)
> > to lua stack with additional lightuserdata and table value and after
> > pcall that function to avoid a raise of error.
> >
> > In this case LuaJIT creates new object which will not live long time,
> > so it increase amount of dead object and also increase time and
> > frequency of garbage collection inside LuaJIT.
> > Also this pcall is necessary only in case when metafield __serialize
> > of serilizable object has LUA_TFUNCTION type.
> >
> > So instead pushcfunction with pcall we can directly call the function
> > trying to serialize an object.
> > ---
>
> 1. Is there a measurement, how much does this patch help and when,
> exactly?
I was faced this when I was looking at the flamegraphs by Aleksandr
Lyapunov related to https://github.com/tarantool/vshard/issues/224
At vshard_router.svg you can see that mp_encode_lua call-chain comes to
luamp_inspect_table, with pushcfunction and gc_step respectively.
So I suppose that simple test with mp_lua_encode would be enough (see
example below) to see a difference.
Note: for your local machine 1e5-1e6 itterations would be ok.
| 20:15:42 jobs:0 s.kaplun at dev4:~/tarantool_builds/lua_mp_pcall$
| >>> src/tarantool
| Tarantool 2.5.0-32-g7f20272
| type 'help' for interactive help
| tarantool> c1_source = {
| setmetatable({[180] = 10, [1] = 0}, {__serialize = "map"}),
| setmetatable({
| [34] = "vshard.router.call_rw",
| [33] = {148, 0, "bench_call_select_r"}
| }, {__serialize = "map"})
| }
| ---
| ...
|
| tarantool> local msgpack = require"msgpack"
| local clock = require"clock"
| local S = clock.proc()
| for i=1,1e7 do msgpack.encode(c1_source) end
| return clock.proc() - S
| ---
| - 9.968856686
| ...
|
| tarantool> 21:00:32 jobs:0 s.kaplun at dev4:~/tarantool_builds/lua_mp_pcall$
| >>> ../master/src/tarantool
| Tarantool 2.5.0-32-g7f20272
| type 'help' for interactive help
| tarantool> c1_source = {
| setmetatable({[180] = 10, [1] = 0}, {__serialize = "map"}),
| setmetatable({
| [34] = "vshard.router.call_rw",
| [33] = {148, 0, "bench_call_select_r"}
| }, {__serialize = "map"})
| }
| ---
| ...
|
| tarantool> local msgpack = require"msgpack"
| local clock = require"clock"
| local S = clock.proc()
| for i=1,1e7 do msgpack.encode(c1_source) end
| return clock.proc() - S
| ---
| - 12.622932064
--
Best regards,
Sergey Kaplun
More information about the Tarantool-patches
mailing list