N/ NIFT LABS

Concurrency / control room

Several things.
At once.

Nift · Python · Node · Bun · Go
Equivalent problems. Different execution models.

NiftRUN / WAIT / JOIN
PythonRUN / WAIT / JOIN
NodeRUN / WAIT / JOIN
BunRUN / WAIT / JOIN
GoRUN / WAIT / JOIN

Execution lanes are a schematic. Charts below contain measured results; no overall concurrency score.

10,290measured observations
608supported cells
1,216retained warmups
64workloads

Execution models

The primitive travels with the number.

Nift

Native threads, snapshot captures, async pool, shared atomic/mutex handles.

Python

asyncio waits, spawn processes for CPU, threads for files/processes; ordinary GIL build.

Node / Bun

Promises and timers for waits; worker_threads for CPU and SAB atomics.

Go

Compiled goroutines, channels, sync and atomic primitives.

01 / schedule

Schedule almost nothing.

Creating, joining and collecting zero-work tasks. Request/response serialization is included; these are not engine-internal scheduler nanoseconds.

Schedule almost nothing.
Schedule almost nothing. Logarithmic ordinate; equally spaced named workloads. Download SVG ↗
Booted isolated request / median ms
WorkloadNiftPythonNodeBunGo
10 tasks3.3861.1752.16710.4630.996
100 tasks16.4201.5882.46210.8731.237
1000 tasks307.2427.3037.08812.2092.927
10000 tasks28,018.83260.99127.37322.24817.989
Fresh invocation / same workload, different boundary
Fresh invocation / median ms
WorkloadNiftPythonNodeBunGo
10 tasks9.24778.42647.45631.0185.069
100 tasks24.93382.05950.72633.0356.102
1000 tasks262.72884.28853.35233.2337.482
10000 tasks31,801.965152.81290.28449.71129.027

02 / tiny

A little work in every branch.

Eight exact recurrence iterations per job. Large task sets are expensive stress cells with five samples for every participant.

A little work in every branch.
A little work in every branch. Logarithmic ordinate; equally spaced named workloads. Download SVG ↗
Booted isolated request / median ms
WorkloadNiftPythonNodeBunGo
10 tasks3.4551.1762.21810.1761.027
100 tasks14.8011.7942.49211.1221.189
1000 tasks328.2798.6947.28212.6483.060
10000 tasks30,949.01779.36230.01624.36317.781
Fresh invocation / same workload, different boundary
Fresh invocation / median ms
WorkloadNiftPythonNodeBunGo
10 tasks9.56279.88748.43831.2955.650
100 tasks22.95180.09450.22032.3156.296
1000 tasks305.41387.72555.09934.5297.802
10000 tasks28,070.537174.452100.66356.69226.474

03 / fan

Fan out. Collect everything.

Every branch has a unique ID. The oracle checks exact values, missing work and duplicate results. This is the same flat create/join shape as tiny arithmetic, retained as a separately sampled fan-out cohort; it does not imply a different executor capability.

Fan out. Collect everything.
Fan out. Collect everything. Logarithmic ordinate; equally spaced named workloads. Download SVG ↗
Booted isolated request / median ms
WorkloadNiftPythonNodeBunGo
10 tasks3.4231.1392.16910.3091.017
100 tasks15.3171.7272.52711.1681.301
1000 tasks326.7268.5517.10612.7303.012
Fresh invocation / same workload, different boundary
Fresh invocation / median ms
WorkloadNiftPythonNodeBunGo
10 tasks10.13281.57550.16431.9266.198
100 tasks21.48779.84949.51732.2616.001
1000 tasks332.00987.86455.61634.8538.465

04 / wait

Wait together.

Nift blocking sleeps occupy native async workers. Event loops suspend promises/tasks and Go suspends goroutines. Equivalent waits do not imply parallel computation. On this four-worker native pool, 1000 × 10ms blocking sleeps have a 2500ms work/worker lower bound; suspended timers have a 10ms critical-path floor before scheduling and result overhead.

Wait together.
Wait together. Logarithmic ordinate; equally spaced named workloads. Download SVG ↗
Booted isolated request / median ms
WorkloadNiftPythonNodeBunGo
100 × 10ms259.22814.07113.24621.20811.983
1000 × 10ms2,579.52019.89519.88323.00114.699
stagger-100279.97824.25022.56931.03422.084
mixed-wait-10089.30123.77022.95030.90521.560
Fresh invocation / same workload, different boundary
Fresh invocation / median ms
WorkloadNiftPythonNodeBunGo
100 × 10ms265.53893.04660.10442.86516.308
1000 × 10ms2,607.229101.88571.87045.71020.775
stagger-100287.428106.64472.38053.63027.091
mixed-wait-10096.292104.89869.67551.96026.670

05 / cpu

Use all four cores.

The same 64 × 200000-iteration kernel at one, two and four workers. Python uses ordinary-GIL multiprocessing; Node/Bun use worker isolates. Pools are created inside each request.

Use all four cores.
Use all four cores. Logarithmic ordinate; equally spaced named workloads. Download SVG ↗
Booted isolated request / median ms
WorkloadNiftPythonNodeBunGo
1 worker10,913.0162,017.077302.906408.38452.855
2 workers5,409.6731,085.507187.179224.62127.516
4 workers2,866.414650.775138.874151.44915.379
Fresh invocation / same workload, different boundary
Fresh invocation / median ms
WorkloadNiftPythonNodeBunGo
1 worker10,808.9062,153.575389.720437.49060.939
2 workers5,540.9751,189.158243.955256.84033.680
4 workers2,836.492747.548196.533172.35224.128
Same fixed work / CPU speedup
Same fixed work / CPU speedup Linear ordinate; equally spaced named workloads. Download SVG ↗
Booted isolated request / speedup ×
WorkloadNiftPythonNodeBunGo
1 worker1.0001.0001.0001.0001.000
2 workers2.0171.8581.6181.8181.921
4 workers3.8073.0992.1812.6973.437

Four-worker efficiency: Nift 95.2%, Python 77.5%, Node 54.5%, Bun 67.4%, Go 85.9%. Ratios of measured medians, without a significance claim.

06 / pool

Give the queue a limit.

One, two or four workers dispatch a fixed 64-job set. Light, medium and heavy bodies reveal the tradeoff between pool setup and useful computation.

Give the queue a limit.
Give the queue a limit. Logarithmic ordinate; equally spaced named workloads. Download SVG ↗
Booted isolated request / median ms
WorkloadNiftPythonNodeBunGo
light / 4 workers7.999128.44766.24647.6111.228
medium / 4 workers11.229130.96669.21551.9311.273
heavy / 4 workers79.305139.64572.62051.6811.870
All workload variants / exact medians
Booted isolated request / median ms
WorkloadNiftPythonNodeBunGo
light / 1 workers22.009109.79453.99137.1550.986
light / 2 workers13.016112.36555.02541.5481.159
light / 4 workers7.999128.44766.24647.6111.228
medium / 1 workers32.585107.72957.32837.7081.160
medium / 2 workers18.445117.17356.27841.6721.224
medium / 4 workers11.229130.96669.21551.9311.273
heavy / 1 workers292.299155.07062.23250.3232.418
heavy / 2 workers150.488136.79363.35047.9701.922
heavy / 4 workers79.305139.64572.62051.6811.870
Fresh invocation / same workload, different boundary
Fresh invocation / median ms
WorkloadNiftPythonNodeBunGo
light / 1 workers27.963200.051102.87861.3866.116
light / 2 workers18.795203.357105.50963.8396.037
light / 4 workers15.331224.685120.38472.5886.809
medium / 1 workers39.620200.803104.52561.2756.223
medium / 2 workers25.048202.786106.19665.1876.736
medium / 4 workers17.677219.188121.88772.5507.024
heavy / 1 workers294.398241.386109.82370.0717.267
heavy / 2 workers155.047226.869110.54969.7147.455
heavy / 4 workers87.258240.520128.47477.9408.094

07 / queue

Talk to each other.

Capacity 64. Go uses channels, Python queue.Queue, JS an authored cooperative promise queue. Nift uses a mutex-protected ring and 1ms empty/full backoff; this is a documented channel/condition-variable gap.

Talk to each other.
Talk to each other. Logarithmic ordinate; equally spaced named workloads. Download SVG ↗
Booted isolated request / messages / second
WorkloadNiftPythonNodeBunGo
1000 / 4→48,302.953138,121.919186,012.96082,608.393471,133.642
10000 / 4→48,575.651249,727.815667,403.658586,439.926794,127.175
100000 / 4→48,450.381303,244.3941,159,468.2411,606,891.404738,741.460
All workload variants / exact medians
Booted isolated request / messages / second
WorkloadNiftPythonNodeBunGo
1000 / 1→19,471.990201,884.511183,553.88482,964.336463,780.806
1000 / 1→48,429.501140,775.010178,083.14779,686.770477,462.573
1000 / 4→18,267.213147,389.942189,910.70980,286.153466,516.697
1000 / 4→48,302.953138,121.919186,012.96082,608.393471,133.642
10000 / 1→19,426.780327,125.505602,289.725608,096.717829,867.564
10000 / 1→48,883.983239,873.733561,229.776488,986.353775,055.460
10000 / 4→18,911.875263,957.516585,037.633520,979.832819,374.873
10000 / 4→48,575.651249,727.815667,403.658586,439.926794,127.175
100000 / 1→19,523.300350,464.4951,005,108.6151,630,183.008826,498.555
100000 / 1→48,817.730268,575.563822,043.9911,303,221.973766,872.118
100000 / 4→18,559.040277,282.710904,841.5511,412,209.269797,427.035
100000 / 4→48,450.381303,244.3941,159,468.2411,606,891.404738,741.460
Fresh invocation / same workload, different boundary
Fresh invocation / median ms
WorkloadNiftPythonNodeBunGo
1000 / 1→1111.50183.25653.27533.6797.568
1000 / 1→4124.76684.71552.64333.8867.466
1000 / 4→1123.90086.00054.00835.1377.602
1000 / 4→4127.22087.82454.19234.6567.802
10000 / 1→11,055.303110.05363.88641.48717.842
10000 / 1→41,135.537124.68069.83145.54418.203
10000 / 4→11,131.324121.59668.67142.89218.852
10000 / 4→41,155.861121.09363.86942.02819.388
100000 / 1→110,301.036348.083149.23194.491140.976
100000 / 1→411,194.095488.286184.522105.096139.180
100000 / 4→111,790.827474.472171.677106.541145.940
100000 / 4→411,409.928430.560147.92895.760137.659

08 / sync

Share state carefully.

Genuine shared atomics only. Python atomic cells and JS native-mutex cells are unavailable (—). Mutex critical sections contain one or eight increments; all counts are exact.

Share state carefully.
Share state carefully. Logarithmic ordinate; equally spaced named workloads. Download SVG ↗
Booted isolated request / median ms
WorkloadNiftPythonNodeBunGo
atomic / 1 workers131.817—49.53435.1160.925
atomic / 2 workers75.267—51.18037.0861.066
atomic / 4 workers46.155—64.56446.1381.096
All workload variants / exact medians
Booted isolated request / median ms
WorkloadNiftPythonNodeBunGo
atomic / 1 workers131.817—49.53435.1160.925
atomic / 2 workers75.267—51.18037.0861.066
atomic / 4 workers46.155—64.56446.1381.096
mutex / 1 increments / 1 workers181.6763.365——1.100
mutex / 1 increments / 2 workers211.7523.428——1.000
mutex / 1 increments / 4 workers221.8104.092——1.065
mutex / 8 increments / 1 workers225.6665.220——1.131
mutex / 8 increments / 2 workers253.5945.366——0.963
mutex / 8 increments / 4 workers275.1636.144——1.160
Fresh invocation / same workload, different boundary
Fresh invocation / median ms
WorkloadNiftPythonNodeBunGo
atomic / 1 workers136.998—98.91158.4347.806
atomic / 2 workers88.338—106.76166.6869.706
atomic / 4 workers56.591—122.15173.8549.178
mutex / 1 increments / 1 workers189.40285.797——8.400
mutex / 1 increments / 2 workers221.58686.153——8.150
mutex / 1 increments / 4 workers241.70888.852——9.044
mutex / 8 increments / 1 workers233.24693.979——8.173
mutex / 8 increments / 2 workers268.41387.318——8.577
mutex / 8 increments / 4 workers274.30887.732——8.942

09 / process

Launch. Capture. Join.

Four concurrent argv-launched identical helpers. No shell startup. Every stdout value and expected exit status is checked, including failures.

Launch. Capture. Join.
Launch. Capture. Join. Logarithmic ordinate; equally spaced named workloads. Download SVG ↗
Booted isolated request / median ms
WorkloadNiftPythonNodeBunGo
process-1012.21915.73629.72122.5085.103
process-10096.92659.507186.84080.51737.541
process-10001,001.112473.9581,799.078474.508336.399
process-mixed119.13892.138195.111101.67679.699
All workload variants / exact medians
Booted isolated request / median ms
WorkloadNiftPythonNodeBunGo
process-1012.21915.73629.72122.5085.103
process-10096.92659.507186.84080.51737.541
process-10001,001.112473.9581,799.078474.508336.399
process-mixed119.13892.138195.111101.67679.699
process-one-failure99.52060.143198.76078.62737.004
process-many-failures90.31254.818167.99278.88535.990
Fresh invocation / same workload, different boundary
Fresh invocation / median ms
WorkloadNiftPythonNodeBunGo
process-1018.34995.74072.24044.33111.067
process-100103.223140.112232.77499.93541.563
process-1000986.584565.4221,812.565505.097330.704
process-mixed128.148179.045246.060128.59086.627
process-one-failure106.171141.927239.718101.48842.926
process-many-failures107.500143.894232.830101.63444.054

10 / files

Read together.

Pregenerated 128-byte files, exact byte hashes, four concurrent operations. This is cached runtime/file orchestration, not a disk benchmark.

Read together.
Read together. Logarithmic ordinate; equally spaced named workloads. Download SVG ↗
Booted isolated request / median ms
WorkloadNiftPythonNodeBunGo
100 files22.69720.17216.87515.2101.960
1000 files145.382107.01478.29227.7557.999
10000 files1,446.8241,035.882707.063129.66572.407
Fresh invocation / same workload, different boundary
Fresh invocation / median ms
WorkloadNiftPythonNodeBunGo
100 files25.029103.15862.29337.5177.730
1000 files154.370203.517142.59053.41414.787
10000 files1,461.2961,146.536762.058150.65479.597

11 / mixed

Different work, one result.

Mixed jobs combine arithmetic, a wait and a child process. Nested parents create four children. Failures collect all outcomes and let successful siblings finish.

Different work, one result.
Different work, one result. Logarithmic ordinate; equally spaced named workloads. Download SVG ↗
Booted isolated request / median ms
WorkloadNiftPythonNodeBunGo
mixed-6493.27962.732152.31776.42758.540
nested-107.4981.3952.05610.4971.045
nested-10053.6535.6804.18110.8601.855
failures3.6131.3692.30110.5641.123
Fresh invocation / same workload, different boundary
Fresh invocation / median ms
WorkloadNiftPythonNodeBunGo
mixed-64102.416153.033209.018105.12868.290
nested-1017.15083.02852.07234.0618.091
nested-10068.96988.45853.64434.9939.755
failures11.87882.01550.75633.7317.823

12 / memory

Keep work alive.

All tasks are staged behind a gate while tree RSS is sampled. Final Nift10k held tasks are outside the certified matrix: a separate probe timed out before READY at45seconds with sampled peak4,137.840MiB below its6GiBguard. This time-censored diagnostic is not a plotted wall/memory result or proof of8GiBinfeasibility. Queued Nift futures need not have started running. Shared pages may be double-counted; this is not unique physical memory.

Keep work alive.
Keep work alive. Linear ordinate; equally spaced named workloads. Download SVG ↗
Booted isolated request / held tree RSS MiB
WorkloadNiftPythonNodeBunGo
100 held tasks10.12520.82448.54722.8753.000
1000 held tasks143.62521.95350.00025.2505.375
10000 held tasks—31.57454.92229.00029.375
CPU worker pools / sampled tree RSS
CPU worker pools / sampled tree RSS Linear ordinate; equally spaced named workloads. Download SVG ↗
Booted isolated request / sampled tree RSS MiB
WorkloadNiftPythonNodeBunGo
1 worker7.12558.26671.25038.6053.125
2 workers7.25079.71184.25041.9843.125
4 workers7.750122.859110.29750.5903.125

Unranked5ms sampled peak accounting, separate from post-READY held checkpoints. Pre-exec supervisor floors and shared mappings can distort it; it cannot rank memory efficiency. The final noop control rose16.75→80.75MiB for0→64MiBparent allocation; no subtraction.

Supporting distributions

Keep the tails visible.

Booted isolated cells: median, p95, range, CPU and memory
Case / boundary / runtimeMedian msp95 msMin–max msCPU msSampled tree MiBn
schedule-10 / persistent / nift3.3863.9642.981–8.9480.0006.50050
schedule-10 / persistent / python1.1751.6071.013–1.8690.00020.07450
schedule-10 / persistent / node2.1672.5161.921–3.1630.00048.50050
schedule-10 / persistent / bun10.46312.8539.642–18.07510.00020.37550
schedule-10 / persistent / go0.9961.4300.793–1.9260.0002.75050
schedule-100 / persistent / nift16.42019.26511.951–21.32440.0007.87550
schedule-100 / persistent / python1.5881.9591.435–2.1420.00020.07450
schedule-100 / persistent / node2.4622.7561.879–3.4600.00048.46150
schedule-100 / persistent / bun10.87312.28210.279–14.47810.00020.37550
schedule-100 / persistent / go1.2371.4411.031–1.6130.0002.75050
schedule-1000 / persistent / nift307.242380.201195.434–390.642650.0009.40650
schedule-1000 / persistent / python7.30310.2726.835–26.83910.00021.82450
schedule-1000 / persistent / node7.08810.1885.084–10.84310.00050.25050
schedule-1000 / persistent / bun12.20914.27011.634–20.37620.00026.31250
schedule-1000 / persistent / go2.9276.4072.346–7.7720.0002.75050
schedule-10000 / persistent / nift28,018.83232,719.50922,282.891–32,719.50941,140.00028.2305
schedule-10000 / persistent / python60.99169.47360.011–69.47370.00031.0555
schedule-10000 / persistent / node27.37337.80724.983–37.80740.00061.1725
schedule-10000 / persistent / bun22.24823.73417.742–23.73440.00031.6255
schedule-10000 / persistent / go17.98919.89715.842–19.89720.0007.6255
tiny-10 / persistent / nift3.4554.4723.020–7.1390.0006.50050
tiny-10 / persistent / python1.1761.4091.029–1.8640.00020.07450
tiny-10 / persistent / node2.2182.6791.812–3.3770.00048.42250
tiny-10 / persistent / bun10.17610.8189.667–11.81510.00020.37550
tiny-10 / persistent / go1.0271.3610.849–1.5010.0002.75050
tiny-100 / persistent / nift14.80119.02312.473–20.98040.0008.12550
tiny-100 / persistent / python1.7942.0731.554–2.4970.00020.07850
tiny-100 / persistent / node2.4922.9102.170–3.1440.00048.42250
tiny-100 / persistent / bun11.12212.76010.267–15.50410.00020.37550
tiny-100 / persistent / go1.1891.4261.037–1.7490.0002.75050
tiny-1000 / persistent / nift328.279380.190227.809–387.412690.0009.40850
tiny-1000 / persistent / python8.6949.8028.211–9.92010.00021.82450
tiny-1000 / persistent / node7.2829.8255.660–10.24810.00050.52350
tiny-1000 / persistent / bun12.64813.77711.920–19.20320.00026.50050
tiny-1000 / persistent / go3.0603.5952.388–3.9630.0002.75050
tiny-10000 / persistent / nift30,949.01731,913.55823,136.945–31,913.55845,710.00027.4265
tiny-10000 / persistent / python79.36284.36472.697–84.36480.00031.0515
tiny-10000 / persistent / node30.01632.48327.179–32.48340.00061.5005
tiny-10000 / persistent / bun24.36325.66323.155–25.66340.00036.6255
tiny-10000 / persistent / go17.78120.17615.470–20.17630.0007.5005
fan-10 / persistent / nift3.4233.9223.005–4.1530.0006.50050
fan-10 / persistent / python1.1391.4820.992–1.6270.00020.07450
fan-10 / persistent / node2.1692.7031.882–3.1760.00048.42250
fan-10 / persistent / bun10.30910.9299.612–12.89110.00020.37550
fan-10 / persistent / go1.0171.2450.809–1.6400.0002.75050
fan-100 / persistent / nift15.31722.95312.126–24.10440.0008.25050
fan-100 / persistent / python1.7272.0291.565–2.1360.00020.07450
fan-100 / persistent / node2.5272.8742.137–3.6740.00048.50050
fan-100 / persistent / bun11.16812.62710.367–15.32210.00020.37550
fan-100 / persistent / go1.3011.8971.070–1.9690.0002.75050
fan-1000 / persistent / nift326.726394.817199.752–400.031685.0009.37750
fan-1000 / persistent / python8.55110.0447.820–11.97210.00021.82450
fan-1000 / persistent / node7.10610.2495.552–11.60810.00050.46150
fan-1000 / persistent / bun12.73016.89411.755–17.84820.00026.50050
fan-1000 / persistent / go3.0123.5832.409–4.5960.0002.75050
wait-100 / persistent / nift259.228260.469258.489–261.11830.00010.25020
wait-100 / persistent / python14.07114.66613.578–14.9790.00021.07420
wait-100 / persistent / node13.24613.77412.571–17.62610.00049.75020
wait-100 / persistent / bun21.20823.43020.540–25.19915.00024.87520
wait-100 / persistent / go11.98312.38411.466–12.3960.0003.12520
wait-1000 / persistent / nift2,579.5202,611.7182,572.338–2,644.203550.000141.25020
wait-1000 / persistent / python19.89522.72419.337–23.38010.00022.57420
wait-1000 / persistent / node19.88323.12617.827–24.44220.00053.25220
wait-1000 / persistent / bun23.00123.83121.808–24.09420.00027.50020
wait-1000 / persistent / go14.69915.41313.904–16.0010.0005.50020
stagger-100 / persistent / nift279.978280.743279.059–281.07130.00010.25020
stagger-100 / persistent / python24.25024.93123.103–28.0650.00021.07420
stagger-100 / persistent / node22.56923.49621.222–23.73310.00049.75020
stagger-100 / persistent / bun31.03431.41730.599–31.81610.00025.75020
stagger-100 / persistent / go22.08422.87921.172–22.9080.0003.06220
mixed-wait-100 / persistent / nift89.30190.94988.350–92.52225.00010.12520
mixed-wait-100 / persistent / python23.77024.32823.505–24.4550.00021.07420
mixed-wait-100 / persistent / node22.95023.42621.898–23.5070.00049.75020
mixed-wait-100 / persistent / bun30.90533.71530.166–35.95915.00025.87520
mixed-wait-100 / persistent / go21.56021.97321.381–22.2600.0003.00020
pool-light-1 / persistent / nift22.00930.64521.086–32.82620.0007.12520
pool-light-1 / persistent / python109.794115.628103.884–126.068110.00058.14520
pool-light-1 / persistent / node53.99158.41951.068–64.77460.00065.25020
pool-light-1 / persistent / bun37.15539.19834.973–39.86740.00031.75020
pool-light-1 / persistent / go0.9861.1450.909–1.2380.0002.75020
pool-light-2 / persistent / nift13.01616.65512.145–17.89920.0007.12520
pool-light-2 / persistent / python112.365125.780105.431–126.768205.00079.71720
pool-light-2 / persistent / node55.02559.12853.449–63.972110.00077.49620
pool-light-2 / persistent / bun41.54845.07737.939–45.80380.00036.86320
pool-light-2 / persistent / go1.1591.4410.961–1.4830.0002.75020
pool-light-4 / persistent / nift7.9998.9917.737–9.12220.0007.62520
pool-light-4 / persistent / python128.447143.612115.257–154.543380.000121.56620
pool-light-4 / persistent / node66.24675.79761.731–78.248210.000100.67220
pool-light-4 / persistent / bun47.61152.57744.250–55.048140.00046.35720
pool-light-4 / persistent / go1.2281.4451.063–1.4500.0002.68820
pool-medium-1 / persistent / nift32.58534.35731.357–34.54330.0007.12520
pool-medium-1 / persistent / python107.729120.88899.768–128.810110.00058.14620
pool-medium-1 / persistent / node57.32863.28450.930–65.56660.00065.37520
pool-medium-1 / persistent / bun37.70849.02635.940–50.90440.00033.50020
pool-medium-1 / persistent / go1.1601.4150.883–1.4560.0002.75020
pool-medium-2 / persistent / nift18.44520.90417.276–26.18630.0007.25020
pool-medium-2 / persistent / python117.173129.173106.245–133.464210.00079.59620
pool-medium-2 / persistent / node56.27864.68552.990–68.391120.00077.33620
pool-medium-2 / persistent / bun41.67248.37838.385–53.06080.00038.48220
pool-medium-2 / persistent / go1.2241.5340.905–1.5650.0002.75020
pool-medium-4 / persistent / nift11.22913.86910.367–21.12130.0007.62520
pool-medium-4 / persistent / python130.966195.323119.328–199.977380.000121.36120
pool-medium-4 / persistent / node69.21592.01161.627–126.106220.000101.23420
pool-medium-4 / persistent / bun51.93159.46245.787–71.927140.00048.44120
pool-medium-4 / persistent / go1.2731.6741.033–1.7340.0002.75020
pool-heavy-1 / persistent / nift292.299308.658284.114–308.658290.0007.12510
pool-heavy-1 / persistent / python155.070164.330147.453–164.330160.00058.20710
pool-heavy-1 / persistent / node62.23271.41958.287–71.41970.00071.14810
pool-heavy-1 / persistent / bun50.32357.34447.152–57.34460.00035.75010
pool-heavy-1 / persistent / go2.4182.8252.182–2.8250.0002.75010
pool-heavy-2 / persistent / nift150.488173.097147.124–173.097290.0007.37510
pool-heavy-2 / persistent / python136.793182.197130.222–182.197250.00079.83610
pool-heavy-2 / persistent / node63.35071.67058.102–71.670130.00084.04710
pool-heavy-2 / persistent / bun47.97052.38044.291–52.38090.00041.04710
pool-heavy-2 / persistent / go1.9222.2061.770–2.2060.0002.75010
pool-heavy-4 / persistent / nift79.30592.64277.149–92.642290.0007.75010
pool-heavy-4 / persistent / python139.645172.677133.359–172.677435.000122.85210
pool-heavy-4 / persistent / node72.62085.53566.994–85.535235.000108.73410
pool-heavy-4 / persistent / bun51.68154.70548.851–54.705150.00050.44910
pool-heavy-4 / persistent / go1.8702.0951.635–2.0950.0002.68810
cpu-1 / persistent / nift10,913.01611,126.19010,853.880–11,126.19010,910.0007.1255
cpu-1 / persistent / python2,017.0772,065.2992,002.683–2,065.2992,030.00058.2665
cpu-1 / persistent / node302.906309.470292.300–309.470310.00071.2505
cpu-1 / persistent / bun408.384415.612398.572–415.612420.00038.6055
cpu-1 / persistent / go52.85553.22052.791–53.22050.0003.1255
cpu-2 / persistent / nift5,409.6735,604.9135,306.893–5,604.91310,770.0007.2505
cpu-2 / persistent / python1,085.5071,118.0001,072.490–1,118.0002,130.00079.7115
cpu-2 / persistent / node187.179190.794172.516–190.794390.00084.2505
cpu-2 / persistent / bun224.621231.140222.581–231.140450.00041.9845
cpu-2 / persistent / go27.51629.42627.247–29.42650.0003.1255
cpu-4 / persistent / nift2,866.4142,970.5772,822.011–2,970.57711,040.0007.7505
cpu-4 / persistent / python650.775938.582627.307–938.5822,380.000122.8595
cpu-4 / persistent / node138.874143.703129.181–143.703500.000110.2975
cpu-4 / persistent / bun151.449156.104148.016–156.104530.00050.5905
cpu-4 / persistent / go15.37916.53915.216–16.53950.0003.1255
process-10 / persistent / nift12.21924.97410.539–24.97410.0008.56210
process-10 / persistent / python15.73627.41113.563–27.41115.00022.63710
process-10 / persistent / node29.72154.43125.810–54.43135.00050.73410
process-10 / persistent / bun22.50829.32821.032–29.32825.00025.43810
process-10 / persistent / go5.10311.6344.545–11.6340.0002.75010
process-100 / persistent / nift96.926100.22989.210–100.229270.00011.46910
process-100 / persistent / python59.50767.06156.220–67.061140.00044.02010
process-100 / persistent / node186.840197.475173.324–197.475270.00054.60910
process-100 / persistent / bun80.51783.98671.314–83.986170.00039.81210
process-100 / persistent / go37.54142.15533.348–42.155100.0008.37510
process-1000 / persistent / nift1,001.1121,055.305930.875–1,055.3052,955.00013.42210
process-1000 / persistent / python473.958515.893450.002–515.8931,350.00070.53510
process-1000 / persistent / node1,799.0782,188.7901,718.593–2,188.7902,630.00076.94310
process-1000 / persistent / bun474.508493.661456.300–493.6611,215.00099.52310
process-1000 / persistent / go336.399342.545309.374–342.5451,055.00024.56210
process-mixed / persistent / nift119.138122.000115.667–122.000225.00012.38310
process-mixed / persistent / python92.13893.10489.813–93.104120.00026.07610
process-mixed / persistent / node195.111205.330179.340–205.330275.00055.89810
process-mixed / persistent / bun101.676105.23299.453–105.232170.00041.42610
process-mixed / persistent / go79.69984.40278.733–84.402105.0008.93810
process-one-failure / persistent / nift99.520112.20090.292–112.200275.00010.86310
process-one-failure / persistent / python60.14363.15356.372–63.153140.00044.77310
process-one-failure / persistent / node198.760214.717176.166–214.717280.00054.75010
process-one-failure / persistent / bun78.62784.17772.608–84.177165.00042.37510
process-one-failure / persistent / go37.00440.34934.648–40.34995.0006.81210
process-many-failures / persistent / nift90.312101.06387.575–101.063250.00010.96110
process-many-failures / persistent / python54.81859.05249.158–59.052125.00044.52310
process-many-failures / persistent / node167.992183.484156.011–183.484250.00054.56210
process-many-failures / persistent / bun78.88584.44668.872–84.446165.00049.62510
process-many-failures / persistent / go35.99041.32633.765–41.32690.0007.62510
files-100 / persistent / nift22.69731.55716.554–31.55775.0008.12510
files-100 / persistent / python20.17246.47617.132–46.47625.00021.45310
files-100 / persistent / node16.87553.04112.159–53.04130.00051.12510
files-100 / persistent / bun15.21046.72513.717–46.72525.00025.37510
files-100 / persistent / go1.9603.9921.650–3.9920.0002.75010
files-1000 / persistent / nift145.382172.385141.849–172.385550.0009.81210
files-1000 / persistent / python107.014116.62796.576–116.627170.00023.32610
files-1000 / persistent / node78.29288.30371.766–88.303150.00053.58610
files-1000 / persistent / bun27.75529.08626.642–29.08655.00034.62510
files-1000 / persistent / go7.9999.4387.691–9.43815.0003.87510
files-10000 / persistent / nift1,446.8241,502.9761,406.159–1,502.9765,595.00035.26210
files-10000 / persistent / python1,035.8821,321.203907.461–1,321.2031,610.00041.70310
files-10000 / persistent / node707.063757.238644.829–757.2381,400.00064.21910
files-10000 / persistent / bun129.665141.434113.127–141.434305.00043.31110
files-10000 / persistent / go72.40781.18764.145–81.187175.0008.38310
queue-1000-1-1 / persistent / nift105.574121.04498.912–121.044110.0009.18610
queue-1000-1-1 / persistent / python4.9536.7804.697–6.78010.00020.07810
queue-1000-1-1 / persistent / node5.4488.8174.769–8.81710.00048.42210
queue-1000-1-1 / persistent / bun12.05312.61710.874–12.61720.00020.37510
queue-1000-1-1 / persistent / go2.1562.4141.807–2.4140.0002.75010
queue-1000-1-4 / persistent / nift118.631133.516115.411–133.516140.0009.31210
queue-1000-1-4 / persistent / python7.1049.2056.586–9.20510.00020.32410
queue-1000-1-4 / persistent / node5.6159.3934.787–9.39310.00048.46110
queue-1000-1-4 / persistent / bun12.54913.05711.597–13.05720.00020.37510
queue-1000-1-4 / persistent / go2.0942.3001.956–2.3000.0002.75010
queue-1000-4-1 / persistent / nift120.960128.278111.347–128.278140.0009.62110
queue-1000-4-1 / persistent / python6.7858.0765.909–8.07610.00020.38710
queue-1000-4-1 / persistent / node5.2668.2544.999–8.25410.00048.50010
queue-1000-4-1 / persistent / bun12.45513.78311.899–13.78320.00021.43810
queue-1000-4-1 / persistent / go2.1442.5611.846–2.5610.0002.75010
queue-1000-4-4 / persistent / nift120.439124.115115.310–124.115140.0009.81210
queue-1000-4-4 / persistent / python7.24010.3756.678–10.37510.00020.32610
queue-1000-4-4 / persistent / node5.3769.1794.938–9.1795.00048.60910
queue-1000-4-4 / persistent / bun12.10512.82511.474–12.82515.00023.50010
queue-1000-4-4 / persistent / go2.1232.6081.983–2.6080.0002.75010
queue-10000-1-1 / persistent / nift1,060.8081,109.695979.363–1,109.6951,220.00025.50010
queue-10000-1-1 / persistent / python30.56934.31824.349–34.31830.00021.70310
queue-10000-1-1 / persistent / node16.60318.49912.542–18.49920.00054.02310
queue-10000-1-1 / persistent / bun16.44519.10215.703–19.10230.00027.43810
queue-10000-1-1 / persistent / go12.05012.45411.527–12.4540.0005.75010
queue-10000-1-4 / persistent / nift1,125.6211,413.1721,078.251–1,413.1721,355.00024.99810
queue-10000-1-4 / persistent / python41.68949.34737.193–49.34750.00021.76410
queue-10000-1-4 / persistent / node17.81822.04315.770–22.04330.00056.00010
queue-10000-1-4 / persistent / bun20.45031.36319.251–31.36340.00038.31210
queue-10000-1-4 / persistent / go12.90216.43711.232–16.43710.0005.56210
queue-10000-4-1 / persistent / nift1,122.0981,169.7041,083.986–1,169.7041,325.00025.74610
queue-10000-4-1 / persistent / python37.88542.87431.880–42.87440.00021.76610
queue-10000-4-1 / persistent / node17.09319.87214.442–19.87220.00055.02310
queue-10000-4-1 / persistent / bun19.19523.79416.783–23.79440.00034.43810
queue-10000-4-1 / persistent / go12.20413.13711.622–13.13710.0005.62510
queue-10000-4-4 / persistent / nift1,166.0921,240.3261,098.346–1,240.3261,420.00025.39810
queue-10000-4-4 / persistent / python40.04446.89133.779–46.89140.00021.70310
queue-10000-4-4 / persistent / node14.98318.29512.383–18.29520.00054.27010
queue-10000-4-4 / persistent / bun17.05218.22815.885–18.22840.00027.50010
queue-10000-4-4 / persistent / go12.59214.70612.135–14.70610.0005.37510
queue-100000-1-1 / persistent / nift10,500.56210,619.02010,365.145–10,619.02012,030.000179.0165
queue-100000-1-1 / persistent / python285.336375.049275.786–375.049310.00036.9925
queue-100000-1-1 / persistent / node99.492140.80691.072–140.806140.00084.7935
queue-100000-1-1 / persistent / bun61.34364.70958.938–64.709100.00048.8755
queue-100000-1-1 / persistent / go120.992133.807115.733–133.807140.00024.1255
queue-100000-1-4 / persistent / nift11,340.78713,306.03911,148.042–13,306.03913,660.000177.7665
queue-100000-1-4 / persistent / python372.335396.353362.096–396.353430.00037.2195
queue-100000-1-4 / persistent / node121.648131.928114.687–131.928190.00087.8555
queue-100000-1-4 / persistent / bun76.73382.45770.758–82.457100.00049.6255
queue-100000-1-4 / persistent / go130.400133.893126.887–133.893170.00022.6255
queue-100000-4-1 / persistent / nift11,683.55311,832.71711,302.943–11,832.71713,750.000179.3915
queue-100000-4-1 / persistent / python360.643367.578354.242–367.578410.00036.9225
queue-100000-4-1 / persistent / node110.517113.694105.254–113.694160.00086.3915
queue-100000-4-1 / persistent / bun70.81173.93966.464–73.939100.00049.3755
queue-100000-4-1 / persistent / go125.403127.799118.791–127.799150.00020.2195
queue-100000-4-4 / persistent / nift11,833.78612,165.59911,260.291–12,165.59914,200.000177.9265
queue-100000-4-4 / persistent / python329.767335.653293.886–335.653370.00037.1485
queue-100000-4-4 / persistent / node86.24690.43076.237–90.430120.00085.6335
queue-100000-4-4 / persistent / bun62.23271.85460.324–71.854100.00049.0005
queue-100000-4-4 / persistent / go135.365140.002126.522–140.002180.00021.2505
atomic-1 / persistent / nift131.817132.870127.063–132.870130.0006.93810
atomic-1 / persistent / node49.53452.39646.357–52.39650.00064.64810
atomic-1 / persistent / bun35.11637.19534.166–37.19540.00034.99410
atomic-1 / persistent / go0.9251.2090.838–1.2090.0002.75010
mutex-1-1 / persistent / nift181.676188.832178.311–188.832180.0007.00010
mutex-1-1 / persistent / python3.3653.8483.256–3.8485.00020.07410
mutex-1-1 / persistent / go1.1001.4720.954–1.4720.0002.75010
mutex-8-1 / persistent / nift225.666238.063219.058–238.063220.0006.87510
mutex-8-1 / persistent / python5.2206.4375.049–6.43710.00020.07610
mutex-8-1 / persistent / go1.1311.3660.963–1.3660.0002.75010
atomic-2 / persistent / nift75.26783.80566.235–83.805140.0007.00010
atomic-2 / persistent / node51.18063.40949.144–63.409110.00076.68810
atomic-2 / persistent / bun37.08648.13234.767–48.13270.00036.68210
atomic-2 / persistent / go1.0661.2330.892–1.2330.0002.75010
mutex-1-2 / persistent / nift211.752226.592200.061–226.592280.0007.12510
mutex-1-2 / persistent / python3.4284.8503.356–4.8505.00020.07610
mutex-1-2 / persistent / go1.0001.2190.827–1.2190.0002.75010
mutex-8-2 / persistent / nift253.594273.081245.750–273.081325.0007.00010
mutex-8-2 / persistent / python5.3665.8565.151–5.8560.00020.07410
mutex-8-2 / persistent / go0.9631.3300.841–1.3300.0002.75010
atomic-4 / persistent / nift46.15553.81643.168–53.816165.0007.12510
atomic-4 / persistent / node64.56471.56462.507–71.564210.000100.10210
atomic-4 / persistent / bun46.13851.63743.506–51.637130.00046.65010
atomic-4 / persistent / go1.0961.3510.981–1.3510.0002.62510
mutex-1-4 / persistent / nift221.810238.178220.052–238.178310.0007.12510
mutex-1-4 / persistent / python4.0924.5143.855–4.5140.00020.07410
mutex-1-4 / persistent / go1.0651.1490.974–1.1490.0002.75010
mutex-8-4 / persistent / nift275.163294.169257.335–294.169365.0007.25010
mutex-8-4 / persistent / python6.1446.5245.747–6.5240.00020.14110
mutex-8-4 / persistent / go1.1601.7940.998–1.7940.0002.75010
failures / persistent / nift3.6134.1103.154–4.1100.0006.50010
failures / persistent / python1.3691.5241.010–1.5240.00020.07610
failures / persistent / node2.3012.7862.063–2.7860.00048.46110
failures / persistent / bun10.56411.9219.806–11.92115.00020.37510
failures / persistent / go1.1231.5760.927–1.5760.0002.75010
mixed-64 / persistent / nift93.27998.61786.714–98.617180.00011.02010
mixed-64 / persistent / python62.73264.33760.469–64.33780.00042.71110
mixed-64 / persistent / node152.317161.740136.315–161.740175.00054.27310
mixed-64 / persistent / bun76.42779.20470.597–79.204110.00036.43810
mixed-64 / persistent / go58.54059.69256.166–59.69255.0006.81210
nested-10 / persistent / nift7.4988.0787.124–8.38110.0008.62520
nested-10 / persistent / python1.3951.6181.302–1.6390.00020.07620
nested-10 / persistent / node2.0562.4751.894–7.1050.00048.50020
nested-10 / persistent / bun10.49710.6769.822–11.01310.00020.37520
nested-10 / persistent / go1.0451.2100.902–1.3320.0002.75020
nested-100 / persistent / nift53.65366.68750.769–67.380180.00023.50020
nested-100 / persistent / python5.6806.2565.194–6.57610.00020.07420
nested-100 / persistent / node4.1817.0543.364–7.1800.00048.71120
nested-100 / persistent / bun10.86011.99310.315–13.45220.00020.37520
nested-100 / persistent / go1.8552.1721.571–2.5890.0002.75020
waiting-memory-100 / persistent / nift264.027265.521263.323–265.52130.00010.1255
waiting-memory-100 / persistent / python14.29114.92613.913–14.9260.00021.1995
waiting-memory-100 / persistent / node13.52613.59713.087–13.5970.00049.6255
waiting-memory-100 / persistent / bun21.33023.09020.618–23.09020.00023.5005
waiting-memory-100 / persistent / go11.96412.35911.832–12.3590.0003.0005
waiting-memory-1000 / persistent / nift2,796.1582,816.4612,787.095–2,816.461510.000143.8755
waiting-memory-1000 / persistent / python22.88223.55722.012–23.55710.00022.5785
waiting-memory-1000 / persistent / node19.83221.91717.289–21.91720.00052.6255
waiting-memory-1000 / persistent / bun22.71524.36721.835–24.36720.00027.6255
waiting-memory-1000 / persistent / go15.21117.07514.905–17.0750.0005.6255
waiting-memory-10000 / persistent / python130.915148.072128.988–148.072130.00037.6255
waiting-memory-10000 / persistent / node57.54760.61455.003–60.61480.00074.3595
waiting-memory-10000 / persistent / bun30.14436.17029.112–36.17040.00036.5005
waiting-memory-10000 / persistent / go58.75368.51956.339–68.519120.00032.8755

p95 uses nearest rank; with five samples it equals the maximum and is descriptive. 5ms tree sampling can miss short-lived processes and double-count shared mappings. CPU ticks limit short-request precision. Held tree RSS is a separate metric. Fresh distributions, maximum-individual-process RSS and process/thread counts remain in canonical evidence.

Implementation contracts

Same problem. Visible boundaries.

Queue, sharing, cancellation and ownership
RuntimeQueue / sharingCancellation / lifetime
NiftMutex ring + polling; snapshot ordinary captures; transferable typed atomic/mutex handlesExplicit join/await; cooperative atomic stop; no public future cancel found
Pythonqueue.Queue; threading.Lock; spawn-process CPU poolasyncio cancel; executor context cleanup; a running process needs separate policy
Node / BunCooperative promise queue; worker isolates; SAB atomics; no native mutex cellAbortSignal where supported; worker termination is separate from promise rejection
GoBuffered channel; sync.Mutex; atomic valuesContext stop signals; WaitGroup and channel close remain explicit

All timed failure cases collect every outcome and allow successful siblings to finish. Separate cancellation probes verify each model, not an identical fail-fast contract. Worker-limit probes validate 1/2/4 active workers; Python uses distinct worker processes. Exact commands and adapter sources are retained in the experiment.

AI-DX / qualitative judgment

Which tool would I choose?

Human + agent: Go for standalone high fan-out/CPU concurrency; Nift for bounded orchestration already in a Nift project. Agent-primary: the same conditional choices. Explicit captures, typed handles and join/await help an agent inspect ownership, but they do not erase the measured throughput gaps or retained-runtime slowdown.

Exact output/error and worker-limit contracts were audited. Autonomous authoring success, race repair and recovery productivity were not measured. Harness JSON is not product-native structured feedback. Prefer concise helpers preserving explicit contracts over duplicated metadata; that is design judgment, not a timing result.

Large scheduling and queue-throughput deficits remain visible in the current peer comparisons. Node/Bun remain natural choices for an existing JS async application; networking capacity was not tested.

Frozen method / public evidence

Same machine. Exact results.

One fresh four-vCPU / 8 GiB Ubuntu 24.04 Linode; AMD EPYC 7642; affinity 0–3.

Fresh: start → complete work → capture → exit. Booted isolated request: a new runtime reaches boot-ready before each observation → one request → full response. Startup and exit stay outside that timer; request state is equally isolated for every participant. This does not measure steady-state repeated-request throughput. The booted request includes IPC, serialization and worker-pool setup; it is not engine-only throughput. Workload-sensitive 5–50 samples, two retained warmups, rotated participant order, all four CPUs, no outlier deletion. Every observation passed exact count/value/hash/exit checks and an independent audit.

Nift 4.12.0 final candidate · Python 3.14.4 ordinary GIL · Node 24.21.0 · Bun 1.4.3 · Go 1.27.2
Nift source: c14d06835bca515a5281e41da0e40219c2d60ef0
Measured suite: d6d0cac9e7dd65d12b5bbccd0ec5b542d187c0a6
Accepted evidence: 19e390183b9bcb039abe6aa553ad88a2305b49ee

Raw observations, warmups, semantic traces, environment and audit ↗ · Complete boundaries and commands ↗ · Practitioner review ↗

Filesystem cache state was not reset. Shared cloud CPUs can vary. Five runtimes solve equivalent problems with explicit model differences; these measurements certify this suite, not universal production capacity.