Apple M5 Max — M5 Max, 16-core CPU · 40-core GPU · Metal · 128 GB unified · MLX, llama.cpp Metal.
21 models in this tree. A row appears only when the run used the shared
profile (temperature 0 on every trial, seed 42, one 16384-token slot, C compiled -std=gnu11).
Aya-23 clamps that context to 8192. Older sweeps used different stacks, context sizes, and a 0.7-temperature retry, so they are
not in this table. Their raw JSON is still on disk. Click any column header to sort.
Generated 2026-10-01 17:20.
Where to look: this page ranks the models and prices them by what a working answer costs. Analysis covers behaviour under load, whether the code they write is fast, whether the wording of the prompt changes the answer, and self-repair. The failing samples are split by technology — C, Python, Bash, research — and models shows how to reproduce every number. Charts is the same data as pictures.
How many times does each test run? Coding suites (C, Python, Bash — easy, hard and brutal) and the research paper: 3 trials per task, all at temperature 0 with seed 42, so a miss is the same answer again. Framing, from the older sweep: 20 trials per wording. Decode speed: median of 3 repeated 2048-token generations — the tok/s column shows ±1 std across those runs (hover a cell for the exact count), as does the dot plot on the analysis page. Quality: 6 probes × 3 trials (temp 0, then 0.7×2). Concurrency: one pass per stream level (no repeats). Self-repair: one initial attempt, then up to 5 rounds of compiler feedback. Two writing tasks that are easy to confuse: tok/s is measured on a 1500-word essay about MIT (speed only, content not graded — each model's essay is on its detail page), while the research column is a different test: extracting NFS facts from RHEL 10 documentation. All raw data is downloadable as CSV files.
| model | type | coding total | flaky ↓ | tok/s ± | RAM GB | quality | ppl-w ↓ | ppl-t ↓ | C | Py | Bash | C-hard | Py-hard | Sh-hard | C-brutal | Py-brutal | Sh-brutal | research |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| qwen3.8-flash-next 125B llama.cpp Metal | MoE | 108/126 | 0 | 33.0 ±0 | 39.0 | — | 3.16 | — | 48/48 | 24/24 | 15/24 | 6/9 | 9/9 | 3/9 | — | — | — | 3/3 |
| gpt-oss-120b llama.cpp Metal | MoE | 106/126 | 2 | 61.6 ±1 | 51.7 | — | 15.44 | — | 42/48 | 24/24 | 12/24 | 9/9 | 9/9 | 8/9 | — | — | — | 2/3 |
| gpt-oss-20b llama.cpp Metal | MoE | 104/126 | 3 | 83.1 ±1 | 11.8 | — | 25.00 | 8.24 | 47/48 | 24/24 | 11/24 | 6/9 | 9/9 | 6/9 | — | — | — | 1/3 |
| gemma-4-26b llama.cpp Metal | MoE | 102/126 | 0 | 60.7 ±0 | 16.6 | — | 1,122 | 92.99 | 42/48 | 24/24 | 12/24 | 6/9 | 9/9 | 6/9 | — | — | — | 3/3 |
| qwen3.8-27b llama.cpp Metal | dense | 102/126 | 0 | 14.4 ±0 | 15.6 | — | 11.34 | 6.47 | 45/48 | 24/24 | 12/24 | 6/9 | 9/9 | 3/9 | — | — | — | 3/3 |
| nemotron-3-super 120B llama.cpp Metal | MoE | 102/126 | 0 | 20.4 ±0 | 70.5 | — | 3.95 | — | 45/48 | 24/24 | 15/24 | 3/9 | 9/9 | 3/9 | — | — | — | 3/3 |
| laguna-s 2.1 117B llama.cpp Metal | MoE | 101/126 | 1 | 39.7 ±1 | 61.6 | — | — | — | 47/48 | 24/24 | 15/24 | 6/9 | 9/9 | 0/9 | — | — | — | 0/3 |
| laguna-xs.2 llama.cpp Metal | MoE | 100/126 | 3 | 81.1 ±4 | 16.9 | — | 16.41 | — | 39/48 | 24/24 | 16/24 | 6/9 | 9/9 | 4/9 | — | — | — | 2/3 |
| qwen3-coder-next 80B llama.cpp Metal | MoE | 99/126 | 0 | 54.6 ±1 | 45.6 | — | 27.23 | 253,533 | 42/48 | 21/24 | 15/24 | 6/9 | 6/9 | 6/9 | — | — | — | 3/3 |
| qwen3.6-27b llama.cpp Metal | dense | 99/126 | 0 | 14.8 ±0 | 15.9 | — | 11.97 | 6.13 | 36/48 | 24/24 | 18/24 | 6/9 | 9/9 | 6/9 | — | — | — | 0/3 |
| qwen3.6-35b llama.cpp Metal | MoE | 96/126 | 0 | 63.1 ±1 | 17.9 | — | 11.50 | 4.12 | 42/48 | 21/24 | 15/24 | 3/9 | 9/9 | 3/9 | — | — | — | 3/3 |
| qwen3.5-35b llama.cpp Metal | MoE | 96/126 | 0 | 58.1 ±1 | 19.1 | — | 11.15 | 3.38 | 36/48 | 24/24 | 15/24 | 6/9 | 9/9 | 3/9 | — | — | — | 3/3 |
| devstral-2 24b llama.cpp Metal | dense | 94/126 | 1 | 23.5 ±5 | 16.3 | — | 9.55 | 3.44 | 36/48 | 24/24 | 15/24 | 6/9 | 6/9 | 4/9 | — | — | — | 3/3 |
| glm-4.7-flash llama.cpp Metal | MoE | 94/126 | 1 | 48.4 ±4 | 17.9 | — | 31.95 | 8.58 | 42/48 | 24/24 | 15/24 | 3/9 | 7/9 | 0/9 | — | — | — | 3/3 |
| mistral-small-4 119B llama.cpp Metal | MoE | 91/126 | 3 | 52.2 ±1 | 59.7 | — | — | — | 38/48 | 24/24 | 15/24 | 7/9 | 3/9 | 3/9 | — | — | — | 1/3 |
| qwen3.5-122b-a10b llama.cpp Metal | MoE | 90/126 | 0 | 27.2 ±0 | 68.8 | — | 3.21 | — | 33/48 | 24/24 | 12/24 | 3/9 | 9/9 | 6/9 | — | — | — | 3/3 |
| qwen3.5-27b llama.cpp Metal | dense | 87/126 | 0 | 13.9 ±0 | 18.7 | — | 3.69 | — | 33/48 | 24/24 | 12/24 | 0/9 | 9/9 | 6/9 | — | — | — | 3/3 |
| qwen3-coder-30b llama.cpp Metal | MoE | 86/126 | 1 | 80.5 ±3 | 18.4 | — | 21.45 | 4.61 | 36/48 | 24/24 | 9/24 | 6/9 | 6/9 | 2/9 | — | — | — | 3/3 |
| k2-horizon 36B-A4B llama.cpp Metal | MoE | 86/126 | 2 | 47.1 ±1 | 24.0 | — | 7.89 | — | 36/48 | 24/24 | 10/24 | 6/9 | 6/9 | 3/9 | — | — | — | 1/3 |
| seed-oss 36b llama.cpp Metal | dense | 79/126 | 2 | 11.2 ±0 | 24.5 | — | 5.18 | — | 32/48 | 24/24 | 11/24 | 3/9 | 3/9 | 3/9 | — | — | — | 3/3 |
| aya-23 35b llama.cpp Metal | dense | 66/126 | 0 | 10.8 ±0 | 37.9 | — | 15.31 | 4.81 | 27/48 | 21/24 | 15/24 | 0/9 | 3/9 | 0/9 | — | — | — | 0/3 |
A dense model runs every parameter on every token; a mixture-of-experts model routes each token to a few of its experts, so only the active column does compute. That is why the 125B flash-next decodes like a 6B model and the whole top of the table is MoE — on memory-bandwidth-bound Apple silicon, active parameters are what you pay per token, and MoE buys a large total capacity at a small active cost. The last column, tok/s per active billion, is the efficiency of that trade; dense models are 1x by definition and omitted.
| model | type | total | active | experts | coding | tok/s | tok/s per act-B |
|---|---|---|---|---|---|---|---|
| qwen3.8-flash-next 125B | MoE | 125B | 6B | 512, top-10 +1 | 86% | 33 | 5.5 |
| gpt-oss-120b | MoE | 117B | 5.1B | 128, top-4 | 84% | 62 | 12.1 |
| gpt-oss-20b | MoE | 21B | 3.6B | 32, top-4 | 83% | 83 | 23.1 |
| gemma-4-26b | MoE | 25.2B | 3.8B | 128, top-8 +1 | 81% | 61 | 16.0 |
| qwen3.8-27b | dense | 27B | 27B | — | 81% | 14 | — |
| nemotron-3-super 120B | MoE | 120B | 12B | 512, top-22 +1 | 81% | 20 | 1.7 |
| laguna-s 2.1 117B | MoE | 117B | 3B | 256, top-10 +1 shared | 80% | 40 | 13.2 |
| laguna-xs.2 | MoE | 33.4B | 3B | 256 +1 shared | 79% | 81 | 27.0 |
| qwen3-coder-next 80B | MoE | 80B | 3B | 512, top-10 +1 | 79% | 55 | 18.2 |
| qwen3.6-27b | dense | 27B | 27B | — | 79% | 15 | — |
| qwen3.6-35b | MoE | 35B | 3B | 256, top-8 +1 | 76% | 63 | 21.0 |
| qwen3.5-35b | MoE | 35B | 3B | 256, top-8 +1 | 76% | 58 | 19.4 |
| devstral-2 24b | dense | 24B | 24B | — | 75% | 24 | — |
| glm-4.7-flash | MoE | 30B | 3B | 64, top-4 +1 | 75% | 48 | 16.1 |
| mistral-small-4 119B | MoE | 119B | 6B | 128, top-4 | 72% | 52 | 8.7 |
| qwen3.5-122b-a10b | MoE | 122B | 10B | 256, top-8 +1 | 71% | 27 | 2.7 |
| qwen3.5-27b | dense | 27B | 27B | — | 69% | 14 | — |
| qwen3-coder-30b | MoE | 30B | 3B | 128, top-8 | 68% | 81 | 26.8 |
| k2-horizon 36B-A4B | MoE | 36B | 4B | — | 68% | 47 | 11.8 |
| seed-oss 36b | dense | 36B | 36B | — | 63% | 11 | — |
| aya-23 35b | dense | 35B | 35B | — | 52% | 11 | — |
Green cells are strong, red weak — shaded by percentage so a column can be scanned without reading every number. MLX targets use mlx_lm.perplexity; the llama.cpp-fork GGUFs (qwen38flash, k2horizon, laguna) use llama-perplexity on WikiText-2 (50 chunks). Those two are not comparable. Ollama and mlx-vlm-only architectures show —. coder-next's wikitext figure is measured at sequence-length 128; the default 512 triggers an mlx-lm bug for hybrid-attention models.
Correctness alone picks a model that is right and unusably slow; tok/s alone picks one that is fast and wrong. The number that decides it is the two divided: seconds of wall clock per solution that passes. Across the 41 coding tasks (research excluded), 3 trials each at temperature 0 — timed end to end, failures included, because a wrong answer costs you its generation time too.
| model | type | C min | Python min | Bash min | total min | per attempt |
|---|---|---|---|---|---|---|
| laguna-xs.2 | MoE | 1.4 | 0.6 | 0.7 | 2.8 | 1.3 |
| qwen3-coder-30b | MoE | 1.8 | 0.8 | 0.7 | 3.3 | 1.6 |
| k2-horizon 36B-A4B | MoE | 2.3 | 1.0 | 1.0 | 4.3 | 2.1 |
| qwen3-coder-next 80B | MoE | 2.3 | 1.0 | 1.1 | 4.5 | 2.2 |
| mistral-small-4 119B | MoE | 2.6 | 1.1 | 1.1 | 4.7 | 2.3 |
| qwen3.5-35b | MoE | 2.6 | 1.0 | 1.2 | 4.8 | 2.4 |
| glm-4.7-flash | MoE | 2.4 | 1.2 | 1.3 | 4.9 | 2.4 |
| gemma-4-26b | MoE | 3.1 | 1.2 | 0.9 | 5.2 | 2.5 |
| qwen3.6-35b | MoE | 2.9 | 1.1 | 1.5 | 5.6 | 2.7 |
| laguna-s 2.1 117B | MoE | 4.1 | 1.5 | 1.3 | 6.9 | 3.3 |
| nemotron-3-super 120B | MoE | 6.2 | 2.8 | 2.5 | 11.4 | 5.6 |
| qwen3.5-122b-a10b | MoE | 7.4 | 2.3 | 2.5 | 12.2 | 5.9 |
| qwen3.8-flash-next 125B | MoE | 7.3 | 2.6 | 3.1 | 13.1 | 6.4 |
| devstral-2 24b | dense | 7.8 | 3.3 | 2.4 | 13.4 | 6.6 |
| gpt-oss-120b | MoE | 7.7 | 3.3 | 4.6 | 15.7 | 7.6 |
| qwen3.8-27b | dense | 8.6 | 5.4 | 4.0 | 18.1 | 8.8 |
| gpt-oss-20b | MoE | 8.9 | 2.4 | 7.9 | 19.2 | 9.4 |
| aya-23 35b | dense | 12.4 | 4.7 | 4.6 | 21.8 | 10.6 |
| qwen3.6-27b | dense | 12.4 | 4.8 | 4.7 | 21.9 | 10.7 |
| qwen3.5-27b | dense | 15.2 | 5.5 | 6.0 | 26.7 | 13.0 |
| seed-oss 36b | dense | 192.0 | 89.2 | 79.9 | 361.1 | 176.1 |
Those totals are everything the model spent, right or wrong. Dividing by the answers that actually worked gives the figure below. first try is trial 1 alone, the honest number if you paste the first thing you get. with retry re-asks only when the previous attempt failed and stops at the first pass, so unused retries cost nothing — what a loop around the model really costs.
| model | type | first try | sec/solution | with retry | sec/solution | retry gain | rank |
|---|---|---|---|---|---|---|---|
| qwen3.8-flash-next 125B | MoE | 35/41 | 7.7s | 35/41 | 10.9s | +0 | 1 frontier |
| laguna-xs.2 | MoE | 34/41 | 1.7s | 34/41 | 2.6s | +0 | 2 frontier |
| gpt-oss-120b | MoE | 34/41 | 9.3s | 35/41 | 11.6s | +1 | 3 beaten |
| gpt-oss-20b | MoE | 33/41 | 11.1s | 35/41 | 19.1s | +2 | 4 beaten |
| laguna-s 2.1 117B | MoE | 33/41 | 4.4s | 34/41 | 5.6s | +1 | 5 beaten |
| gemma-4-26b | MoE | 33/41 | 3.3s | 33/41 | 4.8s | +0 | 6 beaten |
| nemotron-3-super 120B | MoE | 33/41 | 7.4s | 33/41 | 10.2s | +0 | 7 beaten |
| qwen3.8-27b | dense | 33/41 | 11.1s | 33/41 | 16.5s | +0 | 8 beaten |
| qwen3.6-27b | dense | 33/41 | 13.6s | 33/41 | 20.1s | +0 | 9 beaten |
| qwen3-coder-next 80B | MoE | 32/41 | 2.9s | 32/41 | 4.2s | +0 | 10 beaten |
| qwen3.5-35b | MoE | 31/41 | 3.2s | 31/41 | 5.0s | +0 | 11 beaten |
| mistral-small-4 119B | MoE | 30/41 | 3.4s | 31/41 | 5.2s | +1 | 12 beaten |
| glm-4.7-flash | MoE | 31/41 | 3.2s | 31/41 | 5.6s | +0 | 13 beaten |
| qwen3.6-35b | MoE | 31/41 | 3.7s | 31/41 | 6.4s | +0 | 14 beaten |
| devstral-2 24b | dense | 31/41 | 8.9s | 31/41 | 14.9s | +0 | 15 beaten |
| k2-horizon 36B-A4B | MoE | 29/41 | 3.1s | 29/41 | 5.1s | +0 | 16 beaten |
| qwen3.5-122b-a10b | MoE | 29/41 | 8.7s | 29/41 | 15.2s | +0 | 17 beaten |
| qwen3-coder-30b | MoE | 27/41 | 2.5s | 28/41 | 4.2s | +1 | 18 beaten |
| qwen3.5-27b | dense | 28/41 | 19.1s | 28/41 | 34.5s | +0 | 19 beaten |
| seed-oss 36b | dense | 24/41 | 302.0s | 26/41 | 575.4s | +2 | 20 beaten |
| aya-23 35b | dense | 22/41 | 20.1s | 22/41 | 45.5s | +0 | 21 beaten |
Rank is the frontier first (most solutions, then cheapest), then everyone else. beaten means another model is at least as accurate and cheaper — drop it.
kimi-k3 (referee) is not in these tables: the cost here is generation wall-clock, and the referee is a hosted cloud model whose solutions were written in-session, not generated through the harness — there is no timing to report.