Benchmarks: LexiEngine against llama.cpp, and how to reproduce it
LexiEngine is measured against the newest llama.cpp release on the same card, with the same model file and the same settings, every time the engine changes. This page has the current results, the cases where llama.cpp is still ahead, the older results, and the method.
Current results (November 13, 2026)
LexiEngine version 5db82d6 against llama.cpp
b12318 (Vulkan, flash attention on the RX 7900 XTX; CUDA on the
RTX 2060). One Radeon RX 7900 XTX (24 GB) capped at
291 W and one RTX 2060 (6 GB) in an
Intel i7-9700 desktop on Linux 7.3,
nothing else running beside any run, one slot, greedy. Generation is
tokens per second after the first token.
Qwen3.8 27B Q4_K_M, 262,144-token context, 4-bit K/V cache, draft-head speculation on both engines
This is one fixed configuration, the one the model is served with every day (batch 2048/512, at most 2 drafted tokens). Every engine change is measured in this table before and after.
| Prompt tokens | Generation, LexiEngine | Generation, llama.cpp | Prompt processing, LexiEngine | Prompt processing, llama.cpp |
|---|---|---|---|---|
| 62 | 76.5 tok/s | 64.9 tok/s | ||
| 76 (256-token answer) | 75.4 tok/s | 63.3 tok/s | ||
| 3,631 | 71.7 tok/s | 57.2 tok/s | 905 tok/s | 704 tok/s |
| 33,002 | 70.2 tok/s | 55.8 tok/s | 769 tok/s | 601 tok/s |
| 133,561 | 50.8 tok/s | device lost | 491 tok/s | |
| 253,291 | 40.2 tok/s | not reachable | 336 tok/s |
One request per row. llama.cpp b12318 lost its Vulkan device
(vk::DeviceLostError) while reading the 133,561-token
prompt, at 88,000 tokens in the first attempt and 113,000 in the second.
LexiEngine read both deep prompts on every attempt. The version before
this one (3db31f8) generated at the same speeds and read
these prompts at 660, 581, 404 and 293 tok/s.
Default settings: three models, both cards
4,096-token context, each engine's defaults, no speculation; prompts of about 50, 580 and 3,600 tokens.
| Card, model | Measure | LexiEngine | llama.cpp b12318 |
|---|---|---|---|
| RX 7900 XTX, Qwythos 9B Q4_K_M | Generation | 124 / 118 / 115 tok/s | 108 / 107 / 105 |
| Prompt processing, 580 / 3,619 tokens | 2,311 / 2,877 tok/s | 1,374 / 2,338 | |
| RX 7900 XTX, DeepSeek-V2-Lite Q4_K_M | Generation | 219 / 209 / 169 tok/s | 194 / 230 / 186 |
| Prompt processing, 547 / 3,586 tokens | 3,721 / 4,290 tok/s | 1,968 / 4,127 | |
| RX 7900 XTX, Gemma 4 E4B Q4_K_M | Generation | 135 / 129 / 125 tok/s | 137 / 133 / 129 |
| Prompt processing, 556 / 3,595 tokens | 1,870 / 2,313 tok/s | 1,835 / 2,763 | |
| RTX 2060, Qwythos 9B Q4_K_M | Generation | 44.6 / 43.6 / 36.5 tok/s | 49.7 / 49.2 / 48.1 |
| Prompt processing, 580 / 3,619 tokens | 242 / 220 tok/s | 1,007 / 1,199 | |
| RTX 2060, Gemma 4 E4B Q4_K_M | Generation | 67.8 / 64.0 / 62.9 tok/s | 69.6 / 70.0 / 67.5 |
| Prompt processing, 556 / 3,595 tokens | 1,144 / 1,223 tok/s | 2,551 / 2,897 |
Where llama.cpp is ahead: Gemma 4 on both cards, longer DeepSeek generation, and prompt processing on the RTX 2060, where LexiEngine is at about a quarter of llama.cpp's speed on a 9B model after tripling in this version. After a long prompt LexiEngine also holds more video memory on the default path (Gemma 4 on the RX 7900 XTX: 11.4 GB against 3.2 GB). These are the current engine work.
With the 27B's draft head on and the same settings on both engines at a 4,096-token context, LexiEngine generates at 82.6 / 74.4 / 59.1 tok/s against llama.cpp's 68.2 / 66.0 / 61.0, and its text with the draft head on is identical to its text with it off.
Results of November 10, 2026
LexiEngine as of November 10, 2026 against llama.cpp b12230 (Vulkan, flash attention). One Radeon RX 7900 XTX (24 GB) capped at 291 W in an Intel i7-9700 desktop on Linux 7.3, the host's own install, nothing else running beside any run, one slot. Both engines are started with the same context length, cache type, sampling and speculation settings. Generation is tokens per second after the first token; prompt processing is prompt tokens divided by the time to the first token.
Qwen3.8 27B Q4_K_M, 240,128-token context, draft-head speculation on both engines
| Prompt tokens | Generation, LexiEngine | Generation, llama.cpp | Prompt processing, LexiEngine | Prompt processing, llama.cpp |
|---|---|---|---|---|
| 78 | 61.8 tok/s | 53.1 tok/s | ||
| 3,630 | 74.9 tok/s | 63.2 tok/s | 878 tok/s | 783 tok/s |
| 68,121 | 56.4 tok/s | 44.3 tok/s | 637 tok/s | 496 tok/s |
| 138,388 | 48.9 tok/s | device lost | 476 tok/s | |
| 231,290 | 42.2 tok/s | not reachable | 353 tok/s |
Short and 3,600-token rows are the median of three requests; the deeper rows are one request each. llama.cpp b12230 rows were measured on 11/09/2026 with the same harness and settings.
llama.cpp b12230 lost its Vulkan device
(vk::DeviceLostError) on the 138,000-token prompt in
three of three attempts, so it has no result at that
depth or beyond. LexiEngine completed every case, including a
231,000-token prompt.
A 9B Qwen3.5-family model (Qwythos 9B Q4_K_M), 524,288-token context, no speculation
| Prompt tokens | Generation, LexiEngine | Generation, llama.cpp | Prompt processing, LexiEngine | Prompt processing, llama.cpp |
|---|---|---|---|---|
| 68 | 112.6 tok/s | 107.5 tok/s | ||
| 3,617 | 109.9 tok/s | 105.3 tok/s | 2,604 tok/s | 2,682 tok/s |
| 68,110 | 93.9 tok/s | 82.8 tok/s | 1,974 tok/s | 1,645 tok/s |
| 138,378 | 83.2 tok/s | 66.9 tok/s | 1,497 tok/s | 1,035 tok/s |
| 258,510 | 68.3 tok/s | 50.2 tok/s | 1,059 tok/s | 616 tok/s |
| 508,879 | 49.9 tok/s | 33.8 tok/s | 656 tok/s | 339 tok/s |
Short and 3,600-token rows are the median of three requests; the deeper rows are one request each. llama.cpp b12230 rows were measured earlier on 11/10/2026 with the same harness and settings.
LexiEngine is ahead at every depth, and the lead grows with depth.
DeepSeek-V2-Lite-Chat Q4_K_M, 16,384-token context, greedy
| Prompt tokens | Generation, LexiEngine | Generation, llama.cpp | First token, LexiEngine | First token, llama.cpp |
|---|---|---|---|---|
| 20 | 215.6 tok/s | 245.6 tok/s | 0.05 s | 0.05 s |
| 139 | 213.7 tok/s | 241.2 tok/s | 0.04 s | 0.07 s |
| 802 | 204.9 tok/s | 229.3 tok/s | 0.16 s | 0.15 s |
| 3,572 | 168.1 tok/s | 187.0 tok/s | 0.66 s | 0.57 s |
| 8,685 | 169.5 tok/s | 138.1 tok/s | 1.58 s | 1.31 s |
| 14,243 | 159.0 tok/s | 110.1 tok/s | 2.34 s | 1.82 s |
One run per prompt on each engine, in the order shown; each prompt extends the one before it and both engines keep the shared prefix, so first-token times cover only the new part of each prompt.
On November 9 this model processed prompts at 134 tok/s on LexiEngine. It now runs batched prompt passes on the GPU's matrix cores, keeps the previous request's shared prefix, and from 4,096 tokens of context reads a compact 16-bit latent cache instead of the expanded keys and values. llama.cpp is still about 14% ahead in generation on short prompts.
Where llama.cpp is ahead
- Short prompts on small models: DeepSeek-V2-Lite (about 14%) and Qwen3 1.7B (25–30% in the November 4 run below, an older engine build).
- The cause is a fixed per-token cost: the number of GPU dispatches that wait for one another. It is the current engine work.
Earlier results
These used older engine builds and older llama.cpp releases. They are kept as history and are not the current state.
Qwen3.8 27B at a 131,072-token context (November 6–7, 2026)
The supplied benchmark record uses an earlier LexiEngine build, llama.cpp b12180 (Vulkan, flash attention), Qwen3.8 27B, and a Radeon RX 7900 XTX capped at 291 W. Host: Intel i7-9700, Linux 7.3, running on the host's own install — not the USB image. Both engines use Q4_1 KV cache, 131,072-token context, one slot, idle machine, no cache reuse, and a fresh random prefix per prompt. Values are medians of three runs except the long 68k row, which had one request and should not be treated as a three-run median.
Generation, tokens per second after the first token
Numbers per cell are in short / 3.6k / 21k / 68k context-length order.
| Model quantization and mode | LexiEngine | llama.cpp b12180 | Reported advantage |
|---|---|---|---|
| IQ4_XS, no MTP | 50.4 / 48.1 / 46.6 / 42.0 | 42.8 / 41.2 / 38.7 / 33.8 | 17%–24% |
| IQ4_XS, MTP | 79.2 / 82.4 / 77.1 / 65.0 | 68.6 / 78.6 / 65.7 / 55.7 | 5%–17% |
| Q4_K_M, no MTP | 42.9 / 41.4 / 39.9 / 36.5 | 38.2 / 36.6 / 34.8 / 30.8 | 12%–18% |
| Q4_K_M, MTP | 71.1 / 75.3 / 70.7 / 56.9 | 66.1 / 70.3 / 56.9 / 45.6 | 7%–25% |
MTP is draft-head speculative decoding. Do not
compare an MTP-on row with MTP-off, even on the same model. In the later
source README, an alternative Q4_K_M MTP short-prompt table reflects a
different engine build. The table here follows the supplied
current benchmark record
(context/BENCHMARKS.md) rather than merging runs from
different builds.
Prompt processing, tokens per second
Each cell lists 3.6k / 21k / 68k prompt-length results.
| Quantization | LexiEngine | llama.cpp b12180 |
|---|---|---|
| IQ4_XS | 920 / 854 / 661 | 872 / 782 / 542 |
| Q4_K_M | 875 / 814 / 638 | 817 / 741 / 522 |
These prompt-throughput values are not generation rates and should not be presented as such. Performance under a different driver, accelerator, processor, thermal state or model quantization is unmeasured by this table.
Smaller model on the USB appliance (November 4, 2026)
A second RX 7900 XTX with Ryzen 9 5900X, LexiOS on Linux 7.3 booted from USB, ran Qwen3 1.7B Q4_K_M on both engines: 8,192-token context, f16 KV cache, one slot, 256 generated tokens, three repetitions, llama.cpp b12090. The range below is the observed variation, not an uncertainty interval.
| Metric | LexiEngine | llama.cpp b12090 |
|---|---|---|
| Short-prompt generation | 257–264 tok/s | 342–344 tok/s |
| 3,586-token-prompt generation | 236–237 tok/s | 294–295 tok/s |
| Time to first token, 3,586-token prompt | 0.84–0.90 s | 0.59–0.63 s |
| Time to first token, short prompt | 0.04 s | 0.16–0.20 s |
On this small-model generation workload, llama.cpp was 25%–30% faster. A different first-token result does not erase that generation gap. Results cannot be extrapolated from 1.7B to 27B.
Method to reproduce a fair measurement
- Record provenance first. Save model identity and content hash, GGUF quantization, engine build, backend and driver, kernel, CPU/GPU, power cap, free memory, KV-cache type, context, batch/slot count, sampling, MTP state and installed settings. If any differ, treat it as a different experiment.
- Keep the machine idle and let thermal conditions stabilize. Close other GPU or CPU loads; note power and thermal policy. Do not mix benchmarks during maintenance, updates or background model downloads.
- Use identical requests and generated-token limits. Test short, approximately 3.6k, 21k and — if memory supports it — 68k-context inputs. Use a new random prompt prefix for each request to prevent cache reuse; label approximate lengths with their actual token counts. Align draft-head speculation on both sides before comparison.
- Repeat at least three times per routine test and record each run. Use the median, not the best result. For a one-run long-context measurement, label the result single-run instead of implying statistical confidence.
- Separate metrics: (a) time to first token in seconds, (b) prompt processing in tok/s, (c) generation in tok/s excluding the first-token delay. Never compare incompatible denominators.
- Assess noise and stability. Track per-run values, warm/cold behavior, variance, memory/power state and failure count. Calculate noise bands/confidence intervals from replicates where possible; do not claim statistical significance with three or fewer observations by default. Reproduce any changed result before accepting an optimization.
- Check output quality with matched prompts, held-out evaluations, perplexity/KLD where supported, and deterministic sampling where possible. Speed gained by changing output or truncating work is not a like-for-like win.
- Export a complete evidence record and compare through Bench and Evaluate, including device/context depth curves and quality gates; never substitute self-reported peaks for representative median trials.
Bench/Panel workflow
- Open Panel Benchmarks and Evals to inspect run results, context-depth curves, comparisons, histograms and evaluation history.
- Review Optimizer for noise-aware search, Fit Lab for quantization and KLD checks, and Power and Hardware for power cap/thermal conditions.
- The engine exposes
lexi-engine bench,topology,lexify-plan,quantizeandcapture-activationsoperations; check the installed build's help before selecting flags. A command existing in the engine does not imply a corresponding Panel form is available on every kernel. - TokenGate's reported CPU-only 1.7B/Q8_0 590-token-state observation was 14.0 s ungated TTFT versus 35.4 s with a quarter keep budget; matching-task accuracy was not measured. Do not advertise this as a speed win.
Controls and interpretation
| Control / measurement | What it does |
|---|---|
| Bench / Evaluate | Runs or reviews performance and held-out quality checks; compare only matching model and hardware conditions. |
| Optimizer | Searches parameters with measured noise margins; candidate improvements require repeatability. |
| Power cap | Limits device power; altering it invalidates direct comparison with results recorded under another cap. |
| MTP on/off | Enables/disables draft-head token proposals; changing it changes the workload and measurement. |
| KV-cache / context / slots | Changes memory use and compute depth; keep all three fixed when comparing engines. |
| TTFT / prefill / decode rates | Measure distinct phases; do not combine or conflate their units. |
See Hardware, Security and Release Notes.