---
title: "OneMedia subtitle speed rows, version 0.5 (arm64)"
url: https://recursiveai.org/onemedia/docs/bench-arm64-0-5/
description: "The 0.5 subtitle speed run on arm64 (Apple M2, macOS): SRT, WebVTT, ASS and TTML parse and convert at 20,000 and 100,000 cues against SubtitlesParser and the Subtitle Edit core library, each row against the bar."
version: "0.7.0-preview.1"
source: https://github.com/recursive-ai-oss/onemedia-csharp/blob/0e0956874fc3b45e20c388b4511049f386ad361f/docs/bench-results/0.5-arm64.md
---

# OneMedia subtitle speed rows, version 0.5 (arm64)

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](https://recursiveai.org/onemedia/docs/bench/).

## 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).

| Row | Sizes with a ratio | Geomean | Worst | Verdict |
|---|---:|---:|---:|---|
| parse srt | 2/2 | 1.11× | 1.21× | within the 1.25× row limit |
| parse vtt | 2/2 | 0.19× | 0.19× | at the bar |
| parse ass | 2/2 | 0.93× | 0.98× | at the bar |
| parse ttml | 2/2 | 0.52× | 0.57× | at the bar |
| convert srt->vtt | 2/2 | 0.52× | 0.70× | at the bar |
| convert srt->ass | 2/2 | 0.85× | 0.93× | at the bar |
| convert srt->ttml | 2/2 | 0.22× | 0.23× | at the bar |
| **all 14 rows** | 14/14 | **0.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](https://recursiveai.org/onemedia/docs/bench/#subtitle-rows). 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.

| Cues | Row | Implementation | Median | Min | Alloc / run | Result | Ratio to the fastest comparator |
|---:|---|---|---:|---:|---:|---:|---:|
| 20,000 | parse srt | onemedia | 7.94 ms | 4.56 ms | 10.5 MiB | 20,000 | **1.21×** (vs SubtitleEdit core) |
| 20,000 | parse srt | SubtitlesParser | 47.33 ms | 38.69 ms | 50.1 MiB | 20,000 | 7.23× |
| 20,000 | parse srt | SubtitleEdit core | 6.55 ms | 5.18 ms | 13.2 MiB | 20,000 | 1.00× |
| 20,000 | parse vtt | onemedia | 6.34 ms | 4.16 ms | 11.1 MiB | 20,000 | **0.19×** (vs SubtitleEdit core) |
| 20,000 | parse vtt | SubtitlesParser | 48.37 ms | 37.51 ms | 65.6 MiB | 20,000 | 1.46× |
| 20,000 | parse vtt | SubtitleEdit core | 33.10 ms | 26.74 ms | 34.8 MiB | 20,000 | 1.00× |
| 20,000 | parse ass | onemedia | 10.46 ms | 6.52 ms | 12.1 MiB | 20,000 | **0.88×** (vs SubtitleEdit core) |
| 20,000 | parse ass | SubtitlesParser | 32.00 ms | 24.67 ms | 27.1 MiB | 20,000 | 2.68× |
| 20,000 | parse ass | SubtitleEdit core | 11.92 ms | 8.03 ms | 19.3 MiB | 20,000 | 1.00× |
| 20,000 | parse ttml | onemedia | 50.27 ms | 31.79 ms | 42.6 MiB | 20,000 | **0.57×** (vs SubtitleEdit core) |
| 20,000 | parse ttml | SubtitleEdit core | 88.22 ms | 68.66 ms | 74.0 MiB | 20,000 | 1.00× |
| 20,000 | convert srt->vtt | onemedia | 17.65 ms | 8.98 ms | 19.6 MiB | 1,316,133 | **0.70×** (vs SubtitleEdit core) |
| 20,000 | convert srt->vtt | SubtitleEdit core | 25.39 ms | 21.87 ms | 35.5 MiB | 1,316,131 | 1.00× |
| 20,000 | convert srt->ass | onemedia | 16.17 ms | 14.66 ms | 21.8 MiB | 1,724,268 | **0.93×** (vs SubtitleEdit core) |
| 20,000 | convert srt->ass | SubtitleEdit core | 17.39 ms | 15.15 ms | 23.3 MiB | 1,740,081 | 1.00× |
| 20,000 | convert srt->ttml | onemedia | 22.11 ms | 15.32 ms | 26.9 MiB | 1,921,339 | **0.20×** (vs SubtitleEdit core) |
| 20,000 | convert srt->ttml | SubtitleEdit core | 109.05 ms | 96.41 ms | 293.9 MiB | 2,282,604 | 1.00× |
| 100,000 | parse srt | onemedia | 63.82 ms | 36.56 ms | 52.6 MiB | 100,000 | **1.01×** (vs SubtitleEdit core) |
| 100,000 | parse srt | SubtitlesParser | 297.06 ms | 269.58 ms | 311.6 MiB | 100,000 | 4.72× |
| 100,000 | parse srt | SubtitleEdit core | 62.88 ms | 33.47 ms | 66.3 MiB | 100,000 | 1.00× |
| 100,000 | parse vtt | onemedia | 33.83 ms | 30.04 ms | 55.3 MiB | 100,000 | **0.19×** (vs SubtitleEdit core) |
| 100,000 | parse vtt | SubtitlesParser | 219.25 ms | 214.48 ms | 327.1 MiB | 100,000 | 1.24× |
| 100,000 | parse vtt | SubtitleEdit core | 176.11 ms | 127.04 ms | 173.4 MiB | 100,000 | 1.00× |
| 100,000 | parse ass | onemedia | 73.66 ms | 50.63 ms | 59.9 MiB | 100,000 | **0.98×** (vs SubtitleEdit core) |
| 100,000 | parse ass | SubtitlesParser | 118.65 ms | 97.78 ms | 149.3 MiB | 23,411 | 1.58× |
| 100,000 | parse ass | SubtitleEdit core | 75.29 ms | 61.12 ms | 96.4 MiB | 100,000 | 1.00× |
| 100,000 | parse ttml | onemedia | 257.96 ms | 188.27 ms | 210.9 MiB | 100,000 | **0.48×** (vs SubtitleEdit core) |
| 100,000 | parse ttml | SubtitleEdit core | 534.91 ms | 512.69 ms | 368.7 MiB | 100,000 | 1.00× |
| 100,000 | convert srt->vtt | onemedia | 68.52 ms | 51.36 ms | 98.2 MiB | 6,586,400 | **0.39×** (vs SubtitleEdit core) |
| 100,000 | convert srt->vtt | SubtitleEdit core | 177.27 ms | 124.20 ms | 177.7 MiB | 6,580,867 | 1.00× |
| 100,000 | convert srt->ass | onemedia | 75.64 ms | 55.81 ms | 106.3 MiB | 8,702,835 | **0.78×** (vs SubtitleEdit core) |
| 100,000 | convert srt->ass | SubtitleEdit core | 97.06 ms | 68.05 ms | 116.5 MiB | 8,770,636 | 1.00× |
| 100,000 | convert srt->ttml | onemedia | 131.38 ms | 92.58 ms | 134.4 MiB | 9,608,556 | **0.23×** (vs SubtitleEdit core) |
| 100,000 | convert srt->ttml | SubtitleEdit core | 570.15 ms | 526.97 ms | 1469.8 MiB | 11,446,592 | 1.00× |
