Recursive AI

OneMedia speed rows, stage 0.3 (arm64)

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.09×0.18×at the bar
mp4-remux3/30.08×0.15×at the bar
mkv-mux0/5--no managed comparator, so the row passes (times are information)
tagw-id34/40.49×0.53×at the bar
tagw-flac2/20.52×0.52×at the bar
tagw-ilst2/20.41×0.48×at the bar
tagw-riff3/30.46×0.54×at the bar
tagw-mkv1/21.09×1.09×within the 1.25× row limit
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. Mac corpus: the files of the 0.2 run plus h264-aac-tags.mp4, audio-aac-priming.m4a, h264-two-audio-tags.mkv and the two files over 4 GiB, regenerated with tools/corpus/generate.sh (ffmpeg 8.0 there, so the bytes differ from the x64 corpus' files of the same name). flac-cover-tags.flac is not in the Mac corpus, so tagw-flac has two files.
  • Tag-write rows edit the same four common fields of a file held in memory; the ratio is against TagLib#, the fastest managed comparator on every file. ATL.NET is 1.6x to 14x slower than TagLib# (its ratio column), least on WAV and most on ilst.
  • tagw-mkv is the slowest row on this machine: 1.09x on its one file, inside the 1.25x per-row limit; the tag-write geomean stays under 1.0x (TagLib# is the only comparator that can edit it; ATL.NET fails on both Matroska files and TagLib# on test1.mkv). On x64 the same row is 0.99x. A row with one file and a comparator that handles almost no Matroska is thin evidence in either direction.
  • Rows mkv-mux, remux-mem and playable have no managed comparator, so they pass; times next to ffmpeg 8.0 and mkvmerge 103.0 are information.
  • remux-mem: the bench's own peak figure is blank on macOS (the runtime reports no peak working set there), so the peaks were taken separately with /usr/bin/time -l around one child process per cell (one cold run plus the big-file samples each): 4.08 GiB MP4 to Matroska 73.3 MiB, to MP4 70.5 MiB; 4.14 GiB Matroska to Matroska 96.4 MiB, to MP4 90.6 MiB (ffmpeg -c copy 99.7 MiB and 40.7 MiB). Times on this Mac (10 to 27 s) are bound by the disk write, not by the remuxer.
  • playable: 13.4 ms here, against 31.1 ms for ffmpeg 8.0 (information).

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

Run 2026-11-02 04:35Z

  • Machine: Apple M2; 8 logical cores; macOS 27.0.1 Arm64
  • ISA: neon crc32 aes dotprod
  • Storage of the corpus: /dev/disk3s5; every file is read once before its rows, so it is in the page cache for all of them
  • .NET: 10.0.11 (.NET 10.0.11)
  • Load average (1 min): before 3.90; during mean 3.51, max 3.90 over 11 samples at 5 s; after 3.22
  • 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 8.0 Copyright (c) 2000-2025 the FFmpeg developers; MP4Box - GPAC version 26.07-revrelease; 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 MiBOneMedia43.9 µs0.06×1.0 MiB5639.4 B1890.0--41.3cold first run 32.86 ms
generated/mp4/h264-aac.mp40.2 MiBOneMedia, movie box last40.7 µs0.06×1.0 MiB5610.2 B1890.0--41.0cold first run 32.36 ms
generated/mp4/h264-aac.mp40.2 MiBSharpMP4693.8 µs1.00×1.4 MiB8009.8 B1890.0--41.0cold first run 37.57 ms
samples/MPEG-4/video.mp426.6 MiBOneMedia490.1 µs0.05×3.0 MiB439.4 B72002.0--41.1cold first run 36.03 ms
samples/MPEG-4/video.mp426.6 MiBOneMedia, movie box last539.4 µs0.06×3.0 MiB438.5 B72002.0--41.2cold first run 34.96 ms
samples/MPEG-4/video.mp426.6 MiBSharpMP49.03 ms1.00×17.5 MiB2551.0 B72002.0--41.0cold first run 59.35 ms
generated/bench/frag-bbb-1080p.mp4691.5 MiBOneMedia16.68 ms0.18×63.0 MiB2363.3 B2796031.2--41.1cold first run 82.81 ms
generated/bench/frag-bbb-1080p.mp4691.5 MiBOneMedia, movie box last8.02 ms0.09×63.0 MiB2363.1 B2796031.2--41.1cold first run 66.96 ms
generated/bench/frag-bbb-1080p.mp4691.5 MiBSharpMP492.49 ms1.00×103.7 MiB3889.9 B2796031.3--41.3cold first run 208.01 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 MiBOneMedia113.0 µs0.06×1.1 MiB6347.9 B1890.0--41.1cold first run 48.00 ms
generated/mp4/h264-aac.mp40.2 MiBSharpMP41.92 ms1.00×2.6 MiB14687.3 B1890.0--41.2cold first run 67.58 ms
samples/MPEG-4/video.mp426.6 MiBOneMedia1.24 ms0.06×3.2 MiB464.3 B72002.0--41.0cold first run 53.06 ms
samples/MPEG-4/video.mp426.6 MiBSharpMP420.12 ms1.00×34.7 MiB5052.8 B72002.0--41.0cold first run 120.43 ms
generated/bench/frag-bbb-1080p.mp4691.5 MiBOneMedia21.91 ms0.15×63.1 MiB2368.1 B2796031.2--41.2cold first run 94.40 ms
generated/bench/frag-bbb-1080p.mp4691.5 MiBSharpMP4142.93 ms1.00×243.3 MiB9122.6 B2796031.3--41.1cold first run 404.76 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 mp4100.78 ms99.70 ms – 101.79 ms84.8
generated/mp4/h264-aac.mp4ffmpeg -c copy -map 0:a:0 -f mp430.81 ms30.29 ms – 38.43 ms18.3
samples/MPEG-4/video.mp4ffmpeg -c copy -map 0:a:0 -f mp442.84 ms41.56 ms – 44.89 ms19.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 MiBOneMedia203.1 µs-1.3 MiB4336.3 B3090.2--41.1cold first run 35.55 ms
matroska-test-files/test1.mkv22.3 MiBOneMedia3.74 ms-9.1 MiB1671.9 B573522.2--41.2cold first run 45.84 ms
matroska-test-files/test5.mkv30.3 MiBOneMedia4.06 ms-5.0 MiB1231.9 B429830.3--41.1cold first run 46.18 ms
blender/Sintel.2010.1080p.mkv1.10 GiBOneMedia129.54 ms-33.2 MiB705.1 B493231125.2--41.0cold first run 252.81 ms
blender/tears_of_steel_1080p.webm544.9 MiBOneMedia69.44 ms-33.3 MiB436.9 B80000544.6--41.0cold first run 186.24 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 matroska1.32 s1.32 s – 1.32 s90.6
blender/Sintel.2010.1080p.mkvmkvmerge322.29 ms322.29 ms – 322.29 ms97.0exit 1
blender/tears_of_steel_1080p.webmffmpeg -c copy -f matroska224.86 ms223.85 ms – 231.85 ms29.1
blender/tears_of_steel_1080p.webmmkvmerge223.34 ms221.49 ms – 226.95 ms59.9exit 1
generated/mkv/h264-aac.mkvffmpeg -c copy -f matroska31.40 ms30.70 ms – 33.02 ms18.1
generated/mkv/h264-aac.mkvmkvmerge48.30 ms47.09 ms – 80.28 ms17.6exit 1
matroska-test-files/test1.mkvffmpeg -c copy -f matroska60.96 ms60.58 ms – 62.93 ms18.0
matroska-test-files/test1.mkvmkvmerge61.85 ms61.42 ms – 62.12 ms55.6exit 1
matroska-test-files/test5.mkvffmpeg -c copy -f matroska84.15 ms84.07 ms – 84.99 ms34.4
matroska-test-files/test5.mkvmkvmerge65.05 ms64.84 ms – 65.28 ms70.9exit 1

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

Run 2026-11-02 04:36Z

  • Machine: Apple M2; 8 logical cores; macOS 27.0.1 Arm64
  • ISA: neon crc32 aes dotprod
  • Storage of the corpus: /dev/disk3s5; every file is read once before its rows, so it is in the page cache for all of them
  • .NET: 10.0.11 (.NET 10.0.11)
  • Load average (1 min): before 3.22; during mean 2.88, max 3.22 over 13 samples at 5 s; after 2.78
  • Elapsed: 1.0 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 8.0 Copyright (c) 2000-2025 the FFmpeg developers; MP4Box - GPAC version 26.07-revrelease; 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.7 µs0.48×77.8 KiB79656.0 B1---41.0cold first run 25.76 ms
generated/audio-es/tagged/id3v24-basic.mp30.0 MiBATL.NET171.8 µs7.73×938.2 KiB960749.3 B1---41.1cold first run 50.77 ms
generated/audio-es/tagged/id3v24-basic.mp30.0 MiBTagLib#22.2 µs1.00×140.5 KiB143835.9 B1---41.0fastest comparator; cold first run 18.95 ms
generated/audio-es/tagged/id3v23-and-v1.mp30.0 MiBOneMedia11.1 µs0.53×79.4 KiB81256.0 B1---41.0cold first run 25.21 ms
generated/audio-es/tagged/id3v23-and-v1.mp30.0 MiBATL.NET162.5 µs7.74×1.0 MiB1073305.1 B1---41.1cold first run 50.78 ms
generated/audio-es/tagged/id3v23-and-v1.mp30.0 MiBTagLib#21.0 µs1.00×137.9 KiB141202.0 B1---41.1fastest comparator; cold first run 15.17 ms
generated/audio-es/tagged/id3v22-basic.mp30.0 MiBOneMedia11.8 µs0.44×80.3 KiB82184.0 B1---41.1cold first run 25.20 ms
generated/audio-es/tagged/id3v22-basic.mp30.0 MiBATL.NET197.9 µs7.41×937.5 KiB959958.2 B1---41.0cold first run 48.57 ms
generated/audio-es/tagged/id3v22-basic.mp30.0 MiBTagLib#26.7 µs1.00×138.2 KiB141554.0 B1---41.2fastest comparator; cold first run 18.92 ms
generated/audio-es/tagged/apev2-only.mp30.0 MiBOneMedia8.5 µs0.52×67.6 KiB69264.0 B1---41.1cold first run 24.83 ms
generated/audio-es/tagged/apev2-only.mp30.0 MiBATL.NET128.2 µs7.84×1.0 MiB1079862.1 B1---41.2cold first run 48.79 ms
generated/audio-es/tagged/apev2-only.mp30.0 MiBTagLib#16.3 µs1.00×116.8 KiB119629.9 B1---41.2fastest comparator; cold first run 19.09 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.2 µs0.52×70.3 KiB72024.0 B1---41.1cold first run 18.47 ms
generated/xiph-flv/flac/tags.flac0.1 MiBATL.NET152.0 µs12.76×784.0 KiB802792.6 B1---41.1cold first run 40.97 ms
generated/xiph-flv/flac/tags.flac0.1 MiBTagLib#11.9 µs1.00×144.1 KiB147592.0 B1---41.2fastest comparator; cold first run 9.24 ms
generated/xiph-flv/tagvar/flac-rich.flac0.1 MiBOneMedia6.7 µs0.51×73.0 KiB74744.0 B1---41.1cold first run 18.61 ms
generated/xiph-flv/tagvar/flac-rich.flac0.1 MiBATL.NET166.2 µs12.78×814.6 KiB834177.4 B1---41.1cold first run 41.67 ms
generated/xiph-flv/tagvar/flac-rich.flac0.1 MiBTagLib#13.0 µs1.00×150.9 KiB154569.8 B1---41.1fastest comparator; cold first run 8.76 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 MiBOneMedia32.2 µs0.35×368.0 KiB376784.0 B1---41.0cold first run 20.62 ms
generated/mp4/h264-aac-tags.mp40.2 MiBATL.NET1.27 ms13.98×1.9 MiB2027397.8 B1---41.1cold first run 54.06 ms
generated/mp4/h264-aac-tags.mp40.2 MiBTagLib#91.0 µs1.00×414.1 KiB424013.0 B1---41.1fastest comparator; cold first run 11.83 ms
generated/editlist/audio-aac-priming.m4a0.0 MiBOneMedia8.7 µs0.48×139.5 KiB142816.0 B1---41.2cold first run 20.37 ms
generated/editlist/audio-aac-priming.m4a0.0 MiBATL.NET186.1 µs10.30×1.1 MiB1102529.7 B1---41.0cold first run 53.73 ms
generated/editlist/audio-aac-priming.m4a0.0 MiBTagLib#18.1 µs1.00×142.4 KiB145785.8 B1---41.0fastest comparator; cold first run 11.14 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 MiBOneMedia58.0 µs0.43×533.0 KiB545768.0 B1---41.1cold first run 18.05 ms
generated/pcm/tagged-wav-info.wav0.5 MiBATL.NET219.4 µs1.64×1.1 MiB1181618.7 B1---41.0cold first run 41.95 ms
generated/pcm/tagged-wav-info.wav0.5 MiBTagLib#133.8 µs1.00×582.8 KiB596761.5 B1---41.2fastest comparator; cold first run 16.99 ms
generated/pcm/tagged-wav-bext.wav0.8 MiBOneMedia83.0 µs0.54×862.8 KiB883545.2 B1---41.1cold first run 18.51 ms
generated/pcm/tagged-wav-bext.wav0.8 MiBATL.NET719.9 µs4.65×1.8 MiB1902873.1 B1---41.1cold first run 43.93 ms
generated/pcm/tagged-wav-bext.wav0.8 MiBTagLib#154.7 µs1.00×911.1 KiB932924.1 B1---41.2fastest comparator; cold first run 16.66 ms
generated/pcm/tagged-wav-id3.wav0.5 MiBOneMedia58.2 µs0.43×533.0 KiB545768.0 B1---41.1cold first run 18.00 ms
generated/pcm/tagged-wav-id3.wav0.5 MiBATL.NET220.2 µs1.63×1.1 MiB1181618.8 B1---41.0cold first run 41.43 ms
generated/pcm/tagged-wav-id3.wav0.5 MiBTagLib#135.5 µs1.00×582.8 KiB596760.3 B1---41.0fastest comparator; cold first run 16.55 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.3 MiBOneMedia59.2 µs1.09×378.4 KiB387448.0 B1---41.2cold first run 39.10 ms
generated/mkv/h264-two-audio-tags.mkv0.3 MiBATL.NETfail-------41.1NullReferenceException: Object reference not set to an instance of an object.
generated/mkv/h264-two-audio-tags.mkv0.3 MiBTagLib#54.3 µs1.00×323.1 KiB330841.6 B1---41.2cold first run 9.70 ms
matroska-test-files/test1.mkv22.3 MiBOneMedia1.63 ms-22.4 MiB23454785.1 B1---41.1cold first run 45.45 ms
matroska-test-files/test1.mkv22.3 MiBATL.NETfail-------41.1NullReferenceException: Object reference not set to an instance of an object.
matroska-test-files/test1.mkv22.3 MiBTagLib#fail-------41.1InvalidOperationException: Invalid EBML format Read

Group C: remux-mem, playable

Run 2026-11-02 04:42Z

  • Machine: Apple M2; 8 logical cores; macOS 27.0.1 Arm64
  • ISA: neon crc32 aes dotprod
  • Storage of the corpus: /dev/disk3s5; every file is read once before its rows, so it is in the page cache for all of them
  • .NET: 10.0.11 (.NET 10.0.11)
  • Load average (1 min): before 2.78; during mean 1.84, max 2.78 over 74 samples at 5 s; after 1.66
  • Elapsed: 6.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 8.0 Copyright (c) 2000-2025 the FFmpeg developers; MP4Box - GPAC version 26.07-revrelease; 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 MP426.55 s-2.1 MiB34.8 B645764177.0--41.2cold first run 26.64 s
generated/large/over4gb-moov-at-end.mp44.08 GiBOneMedia to Matroska9.80 s-21.3 MiB345.3 B645764176.7--41.1cold first run 9.28 s
generated/large/over4gb.mkv4.14 GiBOneMedia to MP427.21 s-5.7 MiB92.9 B645964244.5--41.1cold first run 33.14 s
generated/large/over4gb.mkv4.14 GiBOneMedia to Matroska19.85 s-24.6 MiB399.8 B645964244.0--41.2cold first run 18.60 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 matroska5.23 s5.23 s – 5.23 s99.7
generated/large/over4gb.mkvffmpeg -c copy -f matroska5.20 s5.20 s – 5.20 s40.7

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 MiBOneMedia13.37 ms-1.8 MiB1835584.0 B10.2--41.3cold first run 135.81 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 mp431.12 ms30.67 ms – 43.16 ms18.2