Recursive AI

OneMedia subtitle speed rows, version 0.5 (arm64)

All onemedia docs

One publishable run under the exclusive bench queue (wq run --class bench, one filtered group, subsbench 20000 100000, 30 samples), driven by tools/bench/subsbench-run.sh, on main 0794678 plus the ASS tuning commit described in 0.5-x64.md. Method: docs/bench.md.

Against the bar

Bar: geometric mean of the ratios <= 1.00x and no row worse than 1.25x, against the fastest managed comparator per row (ratio = OneMedia's median over that comparator's median).

RowSizes with a ratioGeomeanWorstVerdict
parse srt2/21.11×1.21×within the 1.25× row limit
parse vtt2/20.19×0.19×at the bar
parse ass2/20.93×0.98×at the bar
parse ttml2/20.52×0.57×at the bar
convert srt->vtt2/20.52×0.70×at the bar
convert srt->ass2/20.85×0.93×at the bar
convert srt->ttml2/20.22×0.23×at the bar
all 14 rows14/140.52×1.21×meets the bar

Notes

  • Rows are parse srt|vtt|ass|ttml and convert srt->vtt|ass|ttml at 20,000 and 100,000 cues, on the synthetic input and with the work described in docs/bench.md. The bar uses the fastest managed comparator per row, which is the Subtitle Edit core library wherever it has the format (SubtitlesParser has no TTML parser and no writers, and is the slowest on every row it has; its ASS reader returns 23,411 of the 100,000 cues).
  • OneMedia does more work than the comparators on every row (encoding and line-ending detection, styled spans, extras, defects with offsets, a loss report on conversion), which favours them.
  • The rows nearest the limit are parse srt (both sizes) and parse ass at 100,000 cues, where the median sits far above the minimum. At 100,000 cues a run allocates 54 to 110 MB (about 17 MB of it the decoded text) and the garbage collector's share is large; the median swings with the collector while the minimum does not (OneMedia's minimum is below the comparator's minimum on both ASS rows; on the SRT rows it is 1.1 to 1.2 times above). Median is the published figure.
  • One publishable run (the build includes the ASS tuning described in 0.5-x64.md). The queue was empty during the run, but the load average averaged 2.74 (the Mac's own background activity); OneMedia and the comparators are sampled in turn so it lands on all of them alike.

Run

  • Machine: Apple M2; 8 logical cores; Darwin 27.0.0 arm64
  • ISA: neon crc32 aes dotprod; the input is generated in memory, so storage is not in play
  • .NET: 10.0.11 runtime, SDK 10.0.400
  • Start 2026-11-02T14:13Z; elapsed 219 s; load average (1 min): before 4.42; during mean 2.74, max 4.42 over 44 samples (5 s samples); after 2.17
  • Comparators as restored: SubtitlesParser 1.5.1 (MIT), Subtitle Edit core library 5.3.0 (libse, GPL, public API only, bench project only)
  • 30 warm-up runs per implementation, then 30 samples in turn; median and minimum; one process; the bytes are in memory

Rows

Ratio is OneMedia's median over the fastest managed comparator's median. Alloc is bytes allocated per run by the calling thread. Result is what each run produced (cues parsed, or bytes written); SubtitlesParser's ASS reader returns 23,411 of 100,000 cues, so it is not the comparator there when it is slower anyway, and its row is information.

CuesRowImplementationMedianMinAlloc / runResultRatio to the fastest comparator
20,000parse srtonemedia7.94 ms4.56 ms10.5 MiB20,0001.21× (vs SubtitleEdit core)
20,000parse srtSubtitlesParser47.33 ms38.69 ms50.1 MiB20,0007.23×
20,000parse srtSubtitleEdit core6.55 ms5.18 ms13.2 MiB20,0001.00×
20,000parse vttonemedia6.34 ms4.16 ms11.1 MiB20,0000.19× (vs SubtitleEdit core)
20,000parse vttSubtitlesParser48.37 ms37.51 ms65.6 MiB20,0001.46×
20,000parse vttSubtitleEdit core33.10 ms26.74 ms34.8 MiB20,0001.00×
20,000parse assonemedia10.46 ms6.52 ms12.1 MiB20,0000.88× (vs SubtitleEdit core)
20,000parse assSubtitlesParser32.00 ms24.67 ms27.1 MiB20,0002.68×
20,000parse assSubtitleEdit core11.92 ms8.03 ms19.3 MiB20,0001.00×
20,000parse ttmlonemedia50.27 ms31.79 ms42.6 MiB20,0000.57× (vs SubtitleEdit core)
20,000parse ttmlSubtitleEdit core88.22 ms68.66 ms74.0 MiB20,0001.00×
20,000convert srt->vttonemedia17.65 ms8.98 ms19.6 MiB1,316,1330.70× (vs SubtitleEdit core)
20,000convert srt->vttSubtitleEdit core25.39 ms21.87 ms35.5 MiB1,316,1311.00×
20,000convert srt->assonemedia16.17 ms14.66 ms21.8 MiB1,724,2680.93× (vs SubtitleEdit core)
20,000convert srt->assSubtitleEdit core17.39 ms15.15 ms23.3 MiB1,740,0811.00×
20,000convert srt->ttmlonemedia22.11 ms15.32 ms26.9 MiB1,921,3390.20× (vs SubtitleEdit core)
20,000convert srt->ttmlSubtitleEdit core109.05 ms96.41 ms293.9 MiB2,282,6041.00×
100,000parse srtonemedia63.82 ms36.56 ms52.6 MiB100,0001.01× (vs SubtitleEdit core)
100,000parse srtSubtitlesParser297.06 ms269.58 ms311.6 MiB100,0004.72×
100,000parse srtSubtitleEdit core62.88 ms33.47 ms66.3 MiB100,0001.00×
100,000parse vttonemedia33.83 ms30.04 ms55.3 MiB100,0000.19× (vs SubtitleEdit core)
100,000parse vttSubtitlesParser219.25 ms214.48 ms327.1 MiB100,0001.24×
100,000parse vttSubtitleEdit core176.11 ms127.04 ms173.4 MiB100,0001.00×
100,000parse assonemedia73.66 ms50.63 ms59.9 MiB100,0000.98× (vs SubtitleEdit core)
100,000parse assSubtitlesParser118.65 ms97.78 ms149.3 MiB23,4111.58×
100,000parse assSubtitleEdit core75.29 ms61.12 ms96.4 MiB100,0001.00×
100,000parse ttmlonemedia257.96 ms188.27 ms210.9 MiB100,0000.48× (vs SubtitleEdit core)
100,000parse ttmlSubtitleEdit core534.91 ms512.69 ms368.7 MiB100,0001.00×
100,000convert srt->vttonemedia68.52 ms51.36 ms98.2 MiB6,586,4000.39× (vs SubtitleEdit core)
100,000convert srt->vttSubtitleEdit core177.27 ms124.20 ms177.7 MiB6,580,8671.00×
100,000convert srt->assonemedia75.64 ms55.81 ms106.3 MiB8,702,8350.78× (vs SubtitleEdit core)
100,000convert srt->assSubtitleEdit core97.06 ms68.05 ms116.5 MiB8,770,6361.00×
100,000convert srt->ttmlonemedia131.38 ms92.58 ms134.4 MiB9,608,5560.23× (vs SubtitleEdit core)
100,000convert srt->ttmlSubtitleEdit core570.15 ms526.97 ms1469.8 MiB11,446,5921.00×