minetest-mods / mesecons

Mod for Minetest that adds digital circuitry [=Minecraft redstone]
https://mesecons.net
Other
211 stars 121 forks source link

optimize mvps_push_or_pull #662

Closed lolbinarycat closed 8 months ago

lolbinarycat commented 11 months ago

this function is a big bottleneck, since it contains several layers of nested loops, and has quite a few allocations in the innermost levels.

i did my best to optimize it, and i'm only confident in about half my changes, although some imprecice testing implied as much as a 10x speedup.

if someone could benchmark this properly and see what changes are worth it, that would be greatly appreciated.

lolbinarycat commented 11 months ago

apperently the CI uses a different lua version than minetest 5.7

since it lacks table.move.

not sure what to make of that

sfan5 commented 11 months ago

table.move was added in Lua 5.3 and appears to be supported as a non-standard extension in LuaJIT. You can't use it.

Desour commented 11 months ago

LuaJIT adds table.move. You can check at load if it exists, and implement add_list without it if it's not there.

lolbinarycat commented 11 months ago

all this code review is nice, but what would really be helpful is for someone benchmark this to see if the speedup is worth me fixing everything up.

or if someone could point me in the direction of some lua/minetest benchmarking tools i could try to do it myself.

my limited testing was based off of realtime and framerate, both of which can be influenced by other processes.

SmallJoker commented 11 months ago

Minetest has an internal profiler:

According to mesecons/actionqueue.lua, the actions are executed each globalstep, thus you should see a difference in one of the mesecons -> globalstep[??] entries after running /profiler save txt (for comparison). I however do not know what the best way to test this optimization would be - 100 pistons with sand on top of them?

lolbinarycat commented 11 months ago

Minetest has an internal profiler:

* Settings to enable it: https://github.com/minetest/minetest/blob/335af393f09b3629587f14d41a90ded4a3cbddcd/builtin/settingtypes.txt#L1734-L1762

* Chat command to export: https://github.com/minetest/minetest/blob/335af393f09b3629587f14d41a90ded4a3cbddcd/builtin/profiler/init.lua#L45-L46

According to mesecons/actionqueue.lua, the actions are executed each globalstep, thus you should see a difference in one of the mesecons -> globalstep[??] entries after running /profiler save txt (for comparison). I however do not know what the best way to test this optimization would be - 100 pistons with sand on top of them?

personally i used stacks of slimeblocks on top of sticky pistons connected to a 1-tick clock.