Concept
Performance
Published benchmark results against Entity Framework Core and Dapper, how they are measured, and how to run the benchmarks yourself.
Kiwi ORM aims to give you one data-access architecture across Entity, Repository and Raw SQL modes without asking you to give up execution performance. These figures are published by Kiwify Labs; the results below are quoted from the product brochure.
How the numbers are produced#
Three warm-up iterations are discarded, ten are measured, and the IQR-filtered median is reported. The benchmark is an interactive console application (not BenchmarkDotNet) that runs the same scenario against Kiwi ORM, EF Core and Dapper on the same database. Each contender's result is validated against a fingerprint, and a scenario that does not match is marked as failed.
Entity mode vs EF Core#
| Scenario | Kiwi ORM | EF Core | Result |
|---|---|---|---|
| Filtered query (city and active) | 1.13 ms | 1.58 ms | 1.40x faster (strongest tested result) |
| Get by primary key | 0.462 ms | 0.633 ms | 1.37x faster |
Across nine tested Entity scenarios, Kiwi ORM was faster than EF Core in eight. The exception was a projection-only read (id, name, email), 1.08x slower, within normal run-to-run variance.
Repository mode vs Dapper and EF Core#
Scenario (findByCityAndIsActiveTrue) |
Kiwi ORM | Dapper | EF Core |
|---|---|---|---|
| Mean time | 0.894 ms | 1.22 ms | 1.29 ms |
That is 1.36x faster than Dapper and 1.44x faster than EF Core. Across fourteen repository scenarios Kiwi ORM beat EF Core in every one and matched or beat Dapper's raw SQL in eleven. Repository queries run through the same cached, typed pipeline as Raw SQL mode, so the clean abstraction costs nothing at execution time.
Raw SQL (KMQL) vs Dapper and EF Core#
The fastest result overall was a parameterised key lookup: 0.422 ms, 1.39x faster than EF Core and a shade faster than Dapper's 0.433 ms. Across ten KMQL scenarios Kiwi ORM beat EF Core in every case and matched or beat Dapper in seven, trailing on three heavier aggregation and join-shaped queries by low single-digit percentages.
CTE benchmark#
A separate benchmark measures Managed CTE on the database you choose: 33 scenarios covering simple CTEs, recursive CTEs and CTE-driven data changes. Kiwi is compared only with itself across databases, because EF Core and Dapper have no equivalent feature. It reports median, average, minimum and maximum times, bytes allocated per operation and garbage collections, and checks every result against an independently computed expectation.
Reading the results#
- Figures are mean or median timings from one benchmark environment. Re-run them on your hardware, with your schema and data volumes, before relying on any number.
- Informix runs Kiwi contenders only (no EF Core or Dapper provider can take part), and Kiwi's measured time there includes the parameter-rewriting wrapper, so Informix numbers are not directly comparable with the other databases.
Run the benchmarks yourself#
The benchmark project is part of the source. It asks which provider to use, then runs entity, repository, raw or all:
dotnet run --project Kiwify.Kiwi.ORM.Benchmarks -c Release
dotnet run --project Kiwify.Kiwi.ORM.Benchmarks -c Release -- --provider postgresql --run all --dataset medium --iterations 10 --warmup 3
Always use the Release configuration. Set KIWI_BENCHMARK_CONNECTION_STRING_<PROVIDER> (for example ..._POSTGRESQL, ..._SQLSERVER, ..._MYSQL, ..._MARIADB, ..._FIREBIRD, ..._SQLITE, ..._INFORMIX) to skip the prompt. Datasets are small, medium and large. The benchmark tables (bm_*) are created and seeded on first run and nothing else in the database is touched.