Recursive AI

OneMedia speed rows, stage 0.3 (x64)

All onemedia docs

Three publishable runs under the exclusive bench queue, one per filtered group, 3 repetitions (tools 3), run on the build of 2026-11-02 (main 33c568d plus the bench rows). Groups: A mp4-mux, mp4-remux, mkv-mux; B tagw-id3, tagw-flac, tagw-ilst, tagw-riff, tagw-mkv; C remux-mem, playable. Comparators: SharpMP4 0.3.2, TagLib# 2.3.0, ATL.NET 7.19. Method: docs/bench.md.

Against the bar

Bar: geometric mean of the ratios <= 1.00x and no file worse than 1.25x, against the fastest managed comparator per file.

RowFiles with a ratioGeomeanWorstVerdict
mp4-mux3/30.15×0.33×at the bar
mp4-remux3/30.10×0.20×at the bar
mkv-mux0/5--no managed comparator, so the row passes (times are information)
tagw-id34/40.44×0.48×at the bar
tagw-flac3/30.41×0.48×at the bar
tagw-ilst2/20.53×0.56×at the bar
tagw-riff3/30.52×0.60×at the bar
tagw-mkv1/20.99×0.99×at the bar
remux-mem0/2--no managed comparator, so the row passes (times are information)
playable0/1--no managed comparator, so the row passes (times are information)

Notes

  • Each group ran as its own job under the exclusive benchmark queue, alone on the machine. Load before/during/after is in each group's header below; the load average also counts the shell steps around the run.
  • Tag-write rows edit the same four common fields (title, artist, album, comment) of a file held in memory; method and the difference in work per implementation are in docs/bench.md. The ratio is against TagLib#, the fastest managed comparator on every file here; ATL.NET is 1.2x to 18x slower than TagLib# (its ratio column), least on WAV and most on APE-tagged MP3.
  • tagw-mkv is not a comparison of breadth: neither comparator is a Matroska writer in practice. ATL.NET fails on both files (NullReferenceException) and TagLib# fails on test1.mkv ("Invalid EBML format"), so the row has one file, h264-two-audio-tags.mkv, where TagLib# reads and writes it. The ratio there is 0.99x (OneMedia 121.8 us, TagLib# 123.4 us) and the bar is met on this machine.
  • Rows mkv-mux, remux-mem and playable have no managed comparator (no managed Matroska writer; no managed remuxer), so they pass; the times next to ffmpeg 7.0.2 and mkvmerge 103.0 are information. mkvmerge exits 1 on these files (warnings about the input) and its time is still the whole run.
  • remux-mem: OneMedia remuxing the two files over 4 GiB (a 4.08 GiB MP4 with the movie box at the end, a 4.14 GiB Matroska file) into MP4 and Matroska on disk peaks at 62 to 95 MiB resident, process start-up included (baseline about 29 MiB); ffmpeg -c copy to Matroska peaks at 31 MiB. Allocation per run is 2 to 25 MiB.
  • playable (MakePlayable for the generic MP4 profile on a 0.2 MiB Matroska file) takes 160 ms here against 7.6 ms for ffmpeg (information). An indicative run on the same machine of the build before the writer fixes took 9.6 ms; the difference is in what the new save path does (flushing the temporary file to disk before the rename), which a 0.2 MiB file notices and a large one does not. It is reported, not tuned.

Group A: mp4-mux, mp4-remux, mkv-mux

Run 2026-11-02 04:44Z

  • Machine: AMD Ryzen 9 7950X3D 16-Core Processor; 32 logical cores; Linux Mint 22.3 X64
  • ISA: sse4.2 avx2 bmi2 avx512f avx512bw
  • Storage of the corpus: /dev/nvme0n1p4; every file is read once before its rows, so it is in the page cache for all of them
  • .NET: 10.0.13 (.NET 10.0.13)
  • Load average (1 min): before 2.66; during mean 2.26, max 2.66 over 10 samples at 5 s; after 1.88
  • Elapsed: 0.8 min; repetitions 3 (managed), 3 (tools); files over 1 GiB get one warm-up run and 3 samples of one run each, and tools once
  • Packages as restored: SharpMP4 0.3.2; RecursiveAI.OneAudio 1.6.1; MetadataExtractor 2.9.3; TagLibSharp 2.3.0.0; z440.atl.core 7.19; Matroska 0.0.12
  • Tools: ffmpeg version 7.0.2-static https://johnvansickle.com/ffmpeg/ Copyrig; MP4Box - GPAC version 26.07-rev0-ga07cbfff-master; mkvmerge v103.0 ('The Darkness') 64-bit; MediaInfo MediaInfo Command line,; ExifTool 13.60

Ratio is OneMedia's median over the fastest managed comparator's median on the same file (below 1.00× is faster). Peak is the process's peak resident set; Baseline is its resident set before any work, so Peak − Baseline is what the work added.

mp4-mux: MP4: write the first AAC track's frames from memory to an MP4 in memory

FileSizeImplementationMedianRatioAlloc / runAlloc / packetPacketsPayload MiBTracks or tagsPeak MiBBaseline MiBNote
generated/mp4/h264-aac.mp40.2 MiBOneMedia42.0 µs0.08×1.0 MiB5639.4 B1890.0-48.028.9cold first run 41.29 ms
generated/mp4/h264-aac.mp40.2 MiBOneMedia, movie box last40.5 µs0.08×1.0 MiB5610.2 B1890.0-47.729.0cold first run 39.82 ms
generated/mp4/h264-aac.mp40.2 MiBSharpMP4495.0 µs1.00×1.4 MiB8010.0 B1890.0-42.929.1cold first run 37.65 ms
samples/MPEG-4/video.mp426.6 MiBOneMedia741.7 µs0.12×3.0 MiB439.3 B72002.0-102.928.9cold first run 42.90 ms
samples/MPEG-4/video.mp426.6 MiBOneMedia, movie box last988.0 µs0.15×3.0 MiB438.5 B72002.0-58.328.8cold first run 41.34 ms
samples/MPEG-4/video.mp426.6 MiBSharpMP46.42 ms1.00×17.5 MiB2550.9 B72002.0-92.628.9cold first run 60.21 ms
generated/bench/frag-bbb-1080p.mp4691.5 MiBOneMedia21.09 ms0.33×63.0 MiB2363.3 B2796031.2-412.128.9cold first run 120.39 ms
generated/bench/frag-bbb-1080p.mp4691.5 MiBOneMedia, movie box last14.44 ms0.23×63.0 MiB2363.1 B2796031.2-364.129.1cold first run 102.55 ms
generated/bench/frag-bbb-1080p.mp4691.5 MiBSharpMP464.02 ms1.00×103.7 MiB3889.9 B2796031.3-400.228.9cold first run 187.77 ms

mp4-remux: MP4: read the first AAC track from a file and write it as an MP4 in memory

FileSizeImplementationMedianRatioAlloc / runAlloc / packetPacketsPayload MiBTracks or tagsPeak MiBBaseline MiBNote
generated/mp4/h264-aac.mp40.2 MiBOneMedia147.8 µs0.07×1.1 MiB6350.6 B1890.0-46.028.9cold first run 55.53 ms
generated/mp4/h264-aac.mp40.2 MiBSharpMP41.99 ms1.00×2.6 MiB14686.9 B1890.0-62.128.9cold first run 77.99 ms
samples/MPEG-4/video.mp426.6 MiBOneMedia1.56 ms0.07×3.2 MiB464.2 B72002.0-77.428.8cold first run 61.74 ms
samples/MPEG-4/video.mp426.6 MiBSharpMP422.59 ms1.00×34.7 MiB5052.2 B72002.0-107.329.0cold first run 126.81 ms
generated/bench/frag-bbb-1080p.mp4691.5 MiBOneMedia28.11 ms0.20×63.1 MiB2368.1 B2796031.2-193.729.0cold first run 126.67 ms
generated/bench/frag-bbb-1080p.mp4691.5 MiBSharpMP4141.52 ms1.00×243.3 MiB9123.1 B2796031.3-406.428.9cold first run 388.05 ms

Reference tools, run as processes (wall time including start-up, peak resident set); information only:

FileToolWall medianWall min – maxPeak MiBNote
generated/bench/frag-bbb-1080p.mp4ffmpeg -c copy -map 0:a:0 -f mp4104.75 ms104.51 ms – 119.40 ms51.7
generated/mp4/h264-aac.mp4ffmpeg -c copy -map 0:a:0 -f mp46.47 ms5.72 ms – 6.51 ms17.5
samples/MPEG-4/video.mp4ffmpeg -c copy -map 0:a:0 -f mp428.80 ms22.34 ms – 32.66 ms17.8

mkv-mux: Matroska/WebM: read every packet and write it to a new Matroska file (no managed Matroska writer to compare with)

FileSizeImplementationMedianRatioAlloc / runAlloc / packetPacketsPayload MiBTracks or tagsPeak MiBBaseline MiBNote
generated/mkv/h264-aac.mkv0.2 MiBOneMedia154.9 µs-1.3 MiB4334.2 B3090.2-74.129.0cold first run 39.88 ms
matroska-test-files/test1.mkv22.3 MiBOneMedia5.00 ms-9.1 MiB1671.9 B573522.2-91.829.0cold first run 54.95 ms
matroska-test-files/test5.mkv30.3 MiBOneMedia4.72 ms-5.0 MiB1231.9 B429830.3-59.728.9cold first run 56.18 ms
blender/Sintel.2010.1080p.mkv1.10 GiBOneMedia137.26 ms-33.2 MiB705.1 B493231125.2-82.328.9cold first run 255.35 ms
blender/tears_of_steel_1080p.webm544.9 MiBOneMedia73.66 ms-33.3 MiB436.9 B80000544.6-99.029.0cold first run 185.32 ms

Reference tools, run as processes (wall time including start-up, peak resident set); information only:

FileToolWall medianWall min – maxPeak MiBNote
blender/Sintel.2010.1080p.mkvffmpeg -c copy -f matroska979.76 ms979.76 ms – 979.76 ms47.8
blender/Sintel.2010.1080p.mkvmkvmerge395.90 ms395.90 ms – 395.90 ms73.6exit 1
blender/tears_of_steel_1080p.webmffmpeg -c copy -f matroska255.02 ms226.06 ms – 271.68 ms19.7
blender/tears_of_steel_1080p.webmmkvmerge216.85 ms215.27 ms – 221.76 ms46.0exit 1
generated/mkv/h264-aac.mkvffmpeg -c copy -f matroska6.90 ms6.86 ms – 7.45 ms17.6
generated/mkv/h264-aac.mkvmkvmerge23.27 ms21.61 ms – 23.54 ms20.4exit 1
matroska-test-files/test1.mkvffmpeg -c copy -f matroska45.93 ms45.06 ms – 48.13 ms16.6
matroska-test-files/test1.mkvmkvmerge48.57 ms47.16 ms – 48.58 ms48.4exit 1
matroska-test-files/test5.mkvffmpeg -c copy -f matroska62.40 ms58.20 ms – 67.82 ms26.5
matroska-test-files/test5.mkvmkvmerge58.83 ms57.71 ms – 62.58 ms65.8exit 1

Group B: tagw-id3, tagw-flac, tagw-ilst, tagw-riff, tagw-mkv

Run 2026-11-02 04:45Z

  • Machine: AMD Ryzen 9 7950X3D 16-Core Processor; 32 logical cores; Linux Mint 22.3 X64
  • ISA: sse4.2 avx2 bmi2 avx512f avx512bw
  • Storage of the corpus: /dev/nvme0n1p4; every file is read once before its rows, so it is in the page cache for all of them
  • .NET: 10.0.13 (.NET 10.0.13)
  • Load average (1 min): before 1.73; during mean 1.45, max 1.73 over 14 samples at 5 s; after 1.30
  • Elapsed: 1.1 min; repetitions 3 (managed), 3 (tools); files over 1 GiB get one warm-up run and 3 samples of one run each, and tools once
  • Packages as restored: SharpMP4 0.3.2; RecursiveAI.OneAudio 1.6.1; MetadataExtractor 2.9.3; TagLibSharp 2.3.0.0; z440.atl.core 7.19; Matroska 0.0.12
  • Tools: ffmpeg version 7.0.2-static https://johnvansickle.com/ffmpeg/ Copyrig; MP4Box - GPAC version 26.07-rev0-ga07cbfff-master; mkvmerge v103.0 ('The Darkness') 64-bit; MediaInfo MediaInfo Command line,; ExifTool 13.60

Ratio is OneMedia's median over the fastest managed comparator's median on the same file (below 1.00× is faster). Peak is the process's peak resident set; Baseline is its resident set before any work, so Peak − Baseline is what the work added.

tagw-id3: MP3: change title, artist, album and comment; the edited file in memory

FileSizeImplementationMedianRatioAlloc / runAlloc / packetPacketsPayload MiBTracks or tagsPeak MiBBaseline MiBNote
generated/audio-es/tagged/id3v24-basic.mp30.0 MiBOneMedia10.0 µs0.43×77.8 KiB79656.0 B1--99.329.0cold first run 30.71 ms
generated/audio-es/tagged/id3v24-basic.mp30.0 MiBATL.NET172.2 µs7.43×936.6 KiB959093.2 B1--98.828.9cold first run 53.18 ms
generated/audio-es/tagged/id3v24-basic.mp30.0 MiBTagLib#23.2 µs1.00×140.5 KiB143834.0 B1--94.229.0fastest comparator; cold first run 22.00 ms
generated/audio-es/tagged/id3v23-and-v1.mp30.0 MiBOneMedia10.6 µs0.48×79.4 KiB81256.0 B1--99.228.9cold first run 27.95 ms
generated/audio-es/tagged/id3v23-and-v1.mp30.0 MiBATL.NET201.7 µs9.22×1.0 MiB1073598.0 B1--99.129.0cold first run 60.17 ms
generated/audio-es/tagged/id3v23-and-v1.mp30.0 MiBTagLib#21.9 µs1.00×137.9 KiB141200.0 B1--94.328.9fastest comparator; cold first run 18.22 ms
generated/audio-es/tagged/id3v22-basic.mp30.0 MiBOneMedia10.8 µs0.42×80.3 KiB82184.0 B1--98.328.8cold first run 27.74 ms
generated/audio-es/tagged/id3v22-basic.mp30.0 MiBATL.NET203.9 µs7.87×935.8 KiB958301.3 B1--98.428.9cold first run 56.76 ms
generated/audio-es/tagged/id3v22-basic.mp30.0 MiBTagLib#25.9 µs1.00×138.2 KiB141554.0 B1--94.429.0fastest comparator; cold first run 22.05 ms
generated/audio-es/tagged/apev2-only.mp30.0 MiBOneMedia7.9 µs0.45×67.6 KiB69216.0 B1--95.528.9cold first run 28.38 ms
generated/audio-es/tagged/apev2-only.mp30.0 MiBATL.NET314.9 µs17.93×1.0 MiB1083776.1 B1--93.029.0cold first run 55.52 ms
generated/audio-es/tagged/apev2-only.mp30.0 MiBTagLib#17.6 µs1.00×116.8 KiB119626.0 B1--94.229.0fastest comparator; cold first run 21.41 ms

tagw-flac: FLAC: change title, artist, album and comment; the edited file in memory

FileSizeImplementationMedianRatioAlloc / runAlloc / packetPacketsPayload MiBTracks or tagsPeak MiBBaseline MiBNote
generated/xiph-flv/flac/tags.flac0.1 MiBOneMedia6.3 µs0.48×70.3 KiB72024.0 B1--91.528.9cold first run 19.48 ms
generated/xiph-flv/flac/tags.flac0.1 MiBATL.NET135.9 µs10.37×783.3 KiB802068.2 B1--99.028.9cold first run 48.78 ms
generated/xiph-flv/flac/tags.flac0.1 MiBTagLib#13.1 µs1.00×144.1 KiB147560.0 B1--95.428.9fastest comparator; cold first run 10.72 ms
generated/xiph-flv/tagvar/flac-cover-tags.flac0.1 MiBOneMedia5.9 µs0.34×75.3 KiB77144.0 B1--91.729.0cold first run 19.59 ms
generated/xiph-flv/tagvar/flac-cover-tags.flac0.1 MiBATL.NET248.5 µs14.35×940.0 KiB962589.0 B1--95.228.9cold first run 51.69 ms
generated/xiph-flv/tagvar/flac-cover-tags.flac0.1 MiBTagLib#17.3 µs1.00×239.9 KiB245705.8 B1--96.429.0fastest comparator; cold first run 11.36 ms
generated/xiph-flv/tagvar/flac-rich.flac0.1 MiBOneMedia6.8 µs0.44×73.0 KiB74744.0 B1--92.828.9cold first run 21.23 ms
generated/xiph-flv/tagvar/flac-rich.flac0.1 MiBATL.NET165.9 µs10.63×814.6 KiB834154.6 B1--96.029.0cold first run 50.32 ms
generated/xiph-flv/tagvar/flac-rich.flac0.1 MiBTagLib#15.6 µs1.00×151.0 KiB154640.0 B1--95.728.9fastest comparator; cold first run 10.88 ms

tagw-ilst: MP4/M4A: change title, artist, album and comment in ilst; the edited file in memory

FileSizeImplementationMedianRatioAlloc / runAlloc / packetPacketsPayload MiBTracks or tagsPeak MiBBaseline MiBNote
generated/mp4/h264-aac-tags.mp40.2 MiBOneMedia82.9 µs0.56×367.9 KiB376760.0 B1--47.328.9cold first run 26.78 ms
generated/mp4/h264-aac-tags.mp40.2 MiBATL.NET1.40 ms9.56×1.9 MiB2027339.7 B1--76.029.0cold first run 61.55 ms
generated/mp4/h264-aac-tags.mp40.2 MiBTagLib#146.7 µs1.00×414.0 KiB423983.5 B1--44.429.0fastest comparator; cold first run 13.74 ms
generated/editlist/audio-aac-priming.m4a0.0 MiBOneMedia9.7 µs0.49×139.4 KiB142744.0 B1--94.929.1cold first run 26.20 ms
generated/editlist/audio-aac-priming.m4a0.0 MiBATL.NET203.1 µs10.34×1.1 MiB1102430.1 B1--97.428.8cold first run 64.39 ms
generated/editlist/audio-aac-priming.m4a0.0 MiBTagLib#19.6 µs1.00×142.3 KiB145712.0 B1--95.229.0fastest comparator; cold first run 13.27 ms

tagw-riff: WAV: change LIST INFO title, artist, album and comment; the edited file in memory

FileSizeImplementationMedianRatioAlloc / runAlloc / packetPacketsPayload MiBTracks or tagsPeak MiBBaseline MiBNote
generated/pcm/tagged-wav-info.wav0.5 MiBOneMedia161.7 µs0.60×533.0 KiB545768.0 B1--45.828.8cold first run 22.75 ms
generated/pcm/tagged-wav-info.wav0.5 MiBATL.NET339.7 µs1.26×1.1 MiB1181619.9 B1--46.028.9cold first run 50.94 ms
generated/pcm/tagged-wav-info.wav0.5 MiBTagLib#269.5 µs1.00×582.8 KiB596757.3 B1--42.029.0fastest comparator; cold first run 22.03 ms
generated/pcm/tagged-wav-bext.wav0.8 MiBOneMedia74.2 µs0.41×863.7 KiB884433.2 B1--55.428.9cold first run 24.00 ms
generated/pcm/tagged-wav-bext.wav0.8 MiBATL.NET610.1 µs3.34×1.8 MiB1902426.8 B1--89.929.0cold first run 55.47 ms
generated/pcm/tagged-wav-bext.wav0.8 MiBTagLib#182.8 µs1.00×911.0 KiB932903.4 B1--46.129.0fastest comparator; cold first run 22.23 ms
generated/pcm/tagged-wav-id3.wav0.5 MiBOneMedia163.0 µs0.59×533.0 KiB545768.0 B1--45.528.9cold first run 22.37 ms
generated/pcm/tagged-wav-id3.wav0.5 MiBATL.NET335.3 µs1.21×1.1 MiB1181619.9 B1--46.229.0cold first run 51.70 ms
generated/pcm/tagged-wav-id3.wav0.5 MiBTagLib#276.8 µs1.00×582.8 KiB596751.4 B1--40.828.9fastest comparator; cold first run 20.71 ms

tagw-mkv: Matroska: change title, artist, album and comment; the edited file in memory

FileSizeImplementationMedianRatioAlloc / runAlloc / packetPacketsPayload MiBTracks or tagsPeak MiBBaseline MiBNote
generated/mkv/h264-two-audio-tags.mkv0.2 MiBOneMedia121.8 µs0.99×378.3 KiB387408.0 B1--51.328.9cold first run 46.71 ms
generated/mkv/h264-two-audio-tags.mkv0.2 MiBATL.NETfail------37.329.0NullReferenceException: Object reference not set to an instance of an object.
generated/mkv/h264-two-audio-tags.mkv0.2 MiBTagLib#123.4 µs1.00×323.1 KiB330811.5 B1--40.229.0cold first run 10.77 ms
matroska-test-files/test1.mkv22.3 MiBOneMedia2.71 ms-22.4 MiB23454160.0 B1--231.829.0cold first run 67.75 ms
matroska-test-files/test1.mkv22.3 MiBATL.NETfail------81.528.8NullReferenceException: Object reference not set to an instance of an object.
matroska-test-files/test1.mkv22.3 MiBTagLib#fail------78.128.9InvalidOperationException: Invalid EBML format Read

Group C: remux-mem, playable

Run 2026-11-02 04:46Z

  • Machine: AMD Ryzen 9 7950X3D 16-Core Processor; 32 logical cores; Linux Mint 22.3 X64
  • ISA: sse4.2 avx2 bmi2 avx512f avx512bw
  • Storage of the corpus: /dev/nvme0n1p4; every file is read once before its rows, so it is in the page cache for all of them
  • .NET: 10.0.13 (.NET 10.0.13)
  • Load average (1 min): before 1.20; during mean 1.17, max 1.26 over 15 samples at 5 s; after 1.17
  • Elapsed: 1.2 min; repetitions 3 (managed), 3 (tools); files over 1 GiB get one warm-up run and 3 samples of one run each, and tools once
  • Packages as restored: SharpMP4 0.3.2; RecursiveAI.OneAudio 1.6.1; MetadataExtractor 2.9.3; TagLibSharp 2.3.0.0; z440.atl.core 7.19; Matroska 0.0.12
  • Tools: ffmpeg version 7.0.2-static https://johnvansickle.com/ffmpeg/ Copyrig; MP4Box - GPAC version 26.07-rev0-ga07cbfff-master; mkvmerge v103.0 ('The Darkness') 64-bit; MediaInfo MediaInfo Command line,; ExifTool 13.60

Ratio is OneMedia's median over the fastest managed comparator's median on the same file (below 1.00× is faster). Peak is the process's peak resident set; Baseline is its resident set before any work, so Peak − Baseline is what the work added.

remux-mem: Remux of the files past 4 GiB into MP4 and Matroska, output to disk: peak resident memory

FileSizeImplementationMedianRatioAlloc / runAlloc / packetPacketsPayload MiBTracks or tagsPeak MiBBaseline MiBNote
generated/large/over4gb-moov-at-end.mp44.08 GiBOneMedia to MP42.37 s-2.1 MiB33.8 B645764173.2-62.329.0cold first run 2.44 s
generated/large/over4gb-moov-at-end.mp44.08 GiBOneMedia to Matroska1.77 s-21.3 MiB345.3 B645764172.9-66.928.9cold first run 1.90 s
generated/large/over4gb.mkv4.14 GiBOneMedia to MP45.43 s-5.7 MiB91.9 B645964240.6-86.929.0cold first run 5.69 s
generated/large/over4gb.mkv4.14 GiBOneMedia to Matroska4.82 s-24.6 MiB399.8 B645964240.1-95.128.9cold first run 5.08 s

Reference tools, run as processes (wall time including start-up, peak resident set); information only:

FileToolWall medianWall min – maxPeak MiBNote
generated/large/over4gb-moov-at-end.mp4ffmpeg -c copy -f matroska2.96 s2.96 s – 2.96 s31.5
generated/large/over4gb.mkvffmpeg -c copy -f matroska3.05 s3.05 s – 3.05 s30.8

playable: MakePlayable (generic MP4): Matroska H.264+AAC to MP4; information

FileSizeImplementationMedianRatioAlloc / runAlloc / packetPacketsPayload MiBTracks or tagsPeak MiBBaseline MiBNote
generated/mkv/h264-aac.mkv0.2 MiBOneMedia160.25 ms-1.7 MiB1833040.0 B10.2-61.628.9cold first run 284.71 ms

Reference tools, run as processes (wall time including start-up, peak resident set); information only:

FileToolWall medianWall min – maxPeak MiBNote
generated/mkv/h264-aac.mkvffmpeg -c copy -f mp47.58 ms7.04 ms – 7.84 ms17.6