Hi, Sergey! thanks for the patch! LGTM Sergey On 12/26/25 12:17, Sergey Kaplun wrote: > This patch adjusts the aforementioned test to use the benchmark > framework introduced before. The default arguments are adjusted > according to the file. The arguments to the script still > can be provided in the command line run. > --- > perf/LuaJIT-benches/coroutine-ring.lua | 64 +++++++++++++++++--------- > 1 file changed, 43 insertions(+), 21 deletions(-) > > diff --git a/perf/LuaJIT-benches/coroutine-ring.lua b/perf/LuaJIT-benches/coroutine-ring.lua > index 1e8c5ef6..747a2ecc 100644 > --- a/perf/LuaJIT-benches/coroutine-ring.lua > +++ b/perf/LuaJIT-benches/coroutine-ring.lua > @@ -1,3 +1,11 @@ > +-- The benchmark to check the performance of coroutine interaction > +-- to test possible "death by concurrency," when one coroutine +-- is active and others are waiting their turn. > +-- For the details see: +-- > https://pybenchmarks.org/u64q/performance.php?test=threadring + +local > bench = require("bench").new(arg) > + > -- The Computer Language Benchmarks Game > --http://shootout.alioth.debian.org/ > -- contributed by Sam Roberts > @@ -7,36 +15,50 @@ local n = tonumber(arg and arg[1]) or 2e7 > > -- fixed size pool > local poolsize = 503 > -local threads = {} > > -- cache these to avoid global environment lookups > -local create = coroutine.create > -local resume = coroutine.resume > local yield = coroutine.yield > > -local id = 1 > -local token = 0 > -local ok > - > local body = function(token) > while true do > token = yield(token + 1) > end > end > > --- create all threads > -for id = 1, poolsize do > - threads[id] = create(body) > -end > +bench:add({ > + name = "coroutine_ring", > + payload = function() > + -- Cache to avoid upvalue lookups. > + local token = 0 > + local n = n > + local poolsize = poolsize > > --- send the token > -repeat > - if id == poolsize then > - id = 1 > - else > - id = id + 1 > - end > - ok, token = resume(threads[id], token) > -until token == n > + -- Cache these to avoid global environment lookups. > + local create = coroutine.create > + local resume = coroutine.resume > + > + local id = 1 > + local ok > + > + -- Create all threads. > + local threads = {} > + for id = 1, poolsize do > + threads[id] = create(body) > + end > + > + -- Send the token. > + repeat > + if id == poolsize then > + id = 1 > + else > + id = id + 1 > + end > + ok, token = resume(threads[id], token) > + until token == n > + return id > + end, > + checker = function(id) return id == (n % poolsize + 1) end, > + items = n, > +}) > > -io.write(id, "\n") > +bench:run_and_report()