Skip to main content

Benchmark Results

How Dekaf compares to Confluent.Kafka, measured with BenchmarkDotNet on GitHub Actions and refreshed on every commit to main.

Last Updated: 2026-08-07 13:39 UTC

At a glance

Each scenario is the median Dekaf-vs-Confluent result over the last 10 CI runs (both clients measured on the same runner), aggregated across message and batch sizes. Memory compares heap allocations per operation from the latest run.

ScenarioSpeed vs ConfluentMemory vs ConfluentConfidence
Produce — one message at a time (awaited)20× faster2.4× less⚠ Noisy
Produce — batcheson par to 2.3× faster22× lessMixed
Produce — fire-and-forgeton par to 1.2× faster111× less⚠ Noisy
Consume — drain a topic1.5× slower to 1.2× faster1.6× less⚠ Noisy
Consume — poll a single message3.6×–10× faster1.6× less⚠ Noisy

"On par" means within ±20% — differences that small are runner noise. A range means the result depends on message or batch size; the per-parameter tables below have the detail.

Full results

Cross-run comparison — last 10 runs, per parameter set

Each ratio pairs Dekaf and Confluent means from the same runner, then reports the median across recent comparable runs. Lower is better; < 1.0 means Dekaf is faster.

Rows with run spread above 30% are marked low-confidence. Run spread is (maximum ratio - minimum ratio) / median ratio.

BenchmarkParametersRunsMedian RatioRatio RangeRun SpreadConfidence
ConsumerBenchmarks.ConsumeAllMessageCount: 100, MessageSize: 100101.170.99–1.4640%⚠ Low
ConsumerBenchmarks.ConsumeAllMessageCount: 100, MessageSize: 1000101.251.00–1.5040%⚠ Low
ConsumerBenchmarks.ConsumeAllMessageCount: 1000, MessageSize: 100100.810.70–1.0846%⚠ Low
ConsumerBenchmarks.ConsumeAllMessageCount: 1000, MessageSize: 1000101.480.80–2.2295%⚠ Low
ConsumerPollBenchmarks.PollSinglePollsPerIteration: 400000, MessageSize: 100100.100.06–0.1146%⚠ Low
ConsumerPollBenchmarks.PollSinglePollsPerIteration: 400000, MessageSize: 1000100.280.16–0.3258%⚠ Low
ProducerBenchmarks.FireAndForgetMessageSize: 100, BatchSize: 100100.960.77–1.2651%⚠ Low
ProducerBenchmarks.FireAndForgetMessageSize: 100, BatchSize: 1000101.010.73–1.2046%⚠ Low
ProducerBenchmarks.FireAndForgetMessageSize: 1000, BatchSize: 100100.820.76–1.0840%⚠ Low
ProducerBenchmarks.FireAndForgetMessageSize: 1000, BatchSize: 1000100.850.72–1.2462%⚠ Low
ProducerBenchmarks.ProduceBatchMessageSize: 100, BatchSize: 100100.430.42–0.444%Stable
ProducerBenchmarks.ProduceBatchMessageSize: 100, BatchSize: 1000100.500.49–0.538%Stable
ProducerBenchmarks.ProduceBatchMessageSize: 1000, BatchSize: 100100.430.41–0.448%Stable
ProducerBenchmarks.ProduceBatchMessageSize: 1000, BatchSize: 1000101.120.99–1.9283%⚠ Low
ProducerBenchmarks.ProduceSingleMessageSize: 100, BatchSize: 100100.050.03–0.45842%⚠ Low
ProducerBenchmarks.ProduceSingleMessageSize: 100, BatchSize: 1000100.050.03–0.45839%⚠ Low
ProducerBenchmarks.ProduceSingleMessageSize: 1000, BatchSize: 100100.050.03–0.44822%⚠ Low
ProducerBenchmarks.ProduceSingleMessageSize: 1000, BatchSize: 1000100.050.03–0.45825%⚠ Low
Latest run — producer benchmarks
MethodCategoriesMessageSizeBatchSizeMeanErrorStdDevRatioRatioSDGen0Gen1AllocatedAlloc RatioConfidence
Confluent_ProduceBatchBatchProduce1001006,234.9 μs86.04 μs56.91 μs1.000.01--105170 B1.00Stable
Dekaf_ProduceBatchBatchProduce1001002,705.6 μs17.61 μs11.65 μs0.430.00--5512 B0.05Stable
Confluent_ProduceBatchBatchProduce10010007,621.1 μs66.16 μs43.76 μs1.000.0162.500031.25001048386 B1.00Stable
Dekaf_ProduceBatchBatchProduce10010003,806.6 μs104.86 μs69.36 μs0.500.01--51890 B0.05Stable
Confluent_ProduceBatchBatchProduce10001006,451.1 μs93.82 μs62.06 μs1.000.017.8125-194772 B1.00Stable
Dekaf_ProduceBatchBatchProduce10001002,850.7 μs42.93 μs28.40 μs0.440.01--7803 B0.04Stable
Confluent_ProduceBatchBatchProduce1000100012,298.1 μs294.27 μs153.91 μs1.000.02109.375046.87501944396 B1.00Stable
Dekaf_ProduceBatchBatchProduce1000100012,530.0 μs377.74 μs224.79 μs1.020.02--70458 B0.04Stable
Confluent_FireAndForgetFireAndForget100100125.5 μs2.01 μs1.33 μs1.000.011.7090-30400 B1.000Stable
Dekaf_FireAndForgetFireAndForget100100109.9 μs7.15 μs3.74 μs0.880.03--161 B0.005Stable
Confluent_FireAndForgetFireAndForget10010001,251.0 μs21.46 μs14.20 μs1.000.0217.5781-304000 B1.000Stable
Dekaf_FireAndForgetFireAndForget10010001,204.1 μs201.49 μs119.90 μs0.960.09--2399 B0.008Stable
Confluent_FireAndForgetFireAndForget10001001,004.0 μs6.80 μs4.05 μs1.000.017.0801-121455 B1.00Stable
Dekaf_FireAndForgetFireAndForget1000100790.7 μs112.27 μs74.26 μs0.790.07--2131 B0.02Stable
Confluent_FireAndForgetFireAndForget100010009,991.4 μs145.27 μs96.09 μs1.000.0170.3125-1214358 B1.00Stable
Dekaf_FireAndForgetFireAndForget100010008,464.2 μs760.43 μs502.98 μs0.850.05--17418 B0.01Stable
Confluent_ProduceSingleSingleProduce1001005,503.6 μs18.14 μs12.00 μs1.000.00--1202 B1.00Stable
Dekaf_ProduceSingleSingleProduce100100309.4 μs17.17 μs11.35 μs0.060.00--624 B0.52Stable
Confluent_ProduceSingleSingleProduce10010005,501.8 μs18.17 μs12.02 μs1.000.00--1202 B1.00Stable
Dekaf_ProduceSingleSingleProduce1001000300.8 μs9.20 μs6.08 μs0.050.00--624 B0.52Stable
Confluent_ProduceSingleSingleProduce10001005,482.7 μs5.63 μs2.95 μs1.000.00--2098 B1.00Stable
Dekaf_ProduceSingleSingleProduce1000100306.2 μs12.99 μs8.59 μs0.060.00--624 B0.30Stable
Confluent_ProduceSingleSingleProduce100010005,488.4 μs9.01 μs5.36 μs1.000.00--2098 B1.00Stable
Dekaf_ProduceSingleSingleProduce10001000308.7 μs13.72 μs9.08 μs0.060.00--624 B0.30Stable
Latest run — consumer benchmarks
MethodMessageCountMessageSizeMeanErrorStdDevMedianRatioRatioSDAllocatedAlloc RatioConfidence
Confluent_ConsumeAll100100131.3 μs57.91 μs30.29 μs115.7 μs1.040.3064.99 KB1.00Stable
Dekaf_ConsumeAll100100126.8 μs5.11 μs2.27 μs127.2 μs1.000.1826.45 KB0.41Stable
Confluent_ConsumeAll1001000166.7 μs48.49 μs25.36 μs165.8 μs1.020.21240.77 KB1.00Stable
Dekaf_ConsumeAll1001000164.8 μs23.45 μs8.36 μs166.4 μs1.010.15202.23 KB0.84Stable
Confluent_ConsumeAll10001001,052.7 μs529.74 μs277.07 μs882.8 μs1.050.34648.59 KB1.00⚠ Low
Dekaf_ConsumeAll1000100806.0 μs147.90 μs65.67 μs792.1 μs0.810.18258.48 KB0.40Stable
Confluent_ConsumeAll100010001,446.0 μs899.80 μs470.61 μs1,312.7 μs1.080.452406.4 KB1.00⚠ Low
Dekaf_ConsumeAll100010001,582.0 μs1,200.43 μs533.00 μs1,933.7 μs1.190.502016.3 KB0.84⚠ Low
MethodPollsPerIterationMessageSizeMeanErrorStdDevRatioRatioSDGen0AllocatedAlloc RatioConfidence
Confluent_PollSingle4000001005,572.4 ns15.80 ns8.26 ns1.000.000.0375654 B1.00Stable
Dekaf_PollSingle400000100577.1 ns137.89 ns91.21 ns0.100.020.0150271 B0.41Stable
Confluent_PollSingle40000010003,504.3 ns3,082.38 ns2,038.80 ns1.451.270.14502454 B1.00⚠ Low
Dekaf_PollSingle40000010001,112.7 ns218.18 ns144.31 ns0.460.280.12252075 B0.85Stable
Protocol serialization — Dekaf internals

Wire protocol serialization/deserialization. Allocated = - means zero heap allocations — the goal of Dekaf's design.

MethodMeanErrorStdDevGen0Allocated
ReadDescribeGroupsV5566.08 ns19.788 ns3.062 ns0.07251224 B
WriteFindCoordinatorV627.02 ns0.069 ns0.018 ns--
WriteDescribeGroupsV645.20 ns0.088 ns0.023 ns--
WriteListConfigResourcesV120.21 ns0.299 ns0.046 ns--
MethodVersionMeanErrorStdDevAllocated
WriteRequest01.964 μs0.0057 μs0.0015 μs-
WriteRequest12.008 μs0.0306 μs0.0047 μs-
MethodVersionMeanErrorStdDevAllocated
WriteRequest82.408 μs0.0095 μs0.0025 μs-
WriteRequest92.406 μs0.0035 μs0.0009 μs-
WriteRequest102.418 μs0.0434 μs0.0113 μs-
WriteRequest112.412 μs0.0189 μs0.0029 μs-
MethodVersionMeanErrorStdDevAllocated
WriteOffsetCommitRequest999.28 ns0.120 ns0.031 ns-
WriteOffsetFetchRequest9101.12 ns0.214 ns0.056 ns-
WriteOffsetCommitRequest1091.93 ns1.053 ns0.163 ns-
WriteOffsetFetchRequest1085.09 ns0.312 ns0.081 ns-
MethodMeanErrorStdDevGen0Allocated
'Write 1000 Int32s'1,635.8 ns2.66 ns1.58 ns--
'Write 100 Strings (100 chars)'1,962.3 ns7.93 ns4.72 ns--
'Write 100 Strings (300 chars)'2,341.3 ns2.16 ns1.43 ns--
'Write 100 String spans (300 chars)'2,251.4 ns4.48 ns2.34 ns--
'Write 100 CompactStrings'2,102.6 ns1.49 ns0.89 ns--
'Write 100 CompactStrings (300 chars)'4,098.6 ns6.32 ns3.31 ns--
'Write 100 CompactString spans (300 chars)'3,993.3 ns3.60 ns2.14 ns--
'Write 1000 VarInts'2,845.2 ns1.44 ns0.96 ns--
'Read 1000 Int32s'1,146.5 ns5.35 ns3.18 ns--
'Read 1000 VarInts'1,816.4 ns6.35 ns4.20 ns--
'Write RecordBatch (10 records)'707.5 ns1.29 ns0.77 ns--
'Write RecordBatch pre-serialized (10 records)'870.3 ns2.82 ns1.47 ns--
'Read RecordBatch (10 records)'168.7 ns0.11 ns0.06 ns--
'Read Gzip RecordBatch (10 records)'1,751.4 ns13.75 ns9.10 ns0.0172312 B
'Read + Iterate RecordBatch (10 records)'1,288.1 ns0.57 ns0.34 ns--
Serializers — Dekaf internals
MethodCategoriesMeanErrorStdDevRatioRatioSDGen0AllocatedAlloc Ratio
'Serialize 100 Messages (key+value)'Batch10,976.13 ns22.203 ns13.213 ns??--?
'Serialize String (10 chars)'Scalar15.55 ns0.056 ns0.033 ns??--?
'Serialize String (100 chars)'Scalar17.75 ns0.008 ns0.004 ns??--?
'Serialize String (1000 chars)'Scalar38.37 ns0.020 ns0.010 ns??--?
'Deserialize String'Scalar34.43 ns0.668 ns0.398 ns??0.0134224 B?
'Serialize Int32'Scalar11.78 ns0.016 ns0.010 ns??--?
'ArrayBufferWriter + Copy'Writer124.19 ns3.988 ns2.638 ns1.000.030.0534896 B1.00
'ReusableBufferWriter Direct'Writer56.44 ns0.124 ns0.082 ns0.450.01--0.00
Compression — Dekaf internals
MethodMeanErrorStdDevGen0Allocated
'Snappy Compress 1KB'290.7 ns1.98 ns1.18 ns0.002948 B
'Snappy Compress 1MB'97,901.2 ns219.27 ns114.68 ns-48 B
'Snappy Decompress 1KB'222.7 ns0.82 ns0.54 ns0.004880 B
'Snappy Decompress 1MB'126,467.3 ns195.10 ns129.05 ns-80 B
How to read these tables
  • Mean: Average execution time
  • Error: Half of 99.9% confidence interval
  • StdDev: Standard deviation of all measurements
  • Ratio: Performance relative to that table's baseline row
    • Producer/Consumer tables: baseline is Confluent.Kafka, so < 1.0 = Dekaf is faster, > 1.0 = Confluent is faster
    • Dekaf-internals tables (Protocol/Serializer/Compression): baseline is an internal reference implementation, not Confluent
  • RatioSD: BenchmarkDotNet's uncertainty for the latest run's ratio
  • Confidence: ⚠ Low when latest RatioSD > 0.30 or rolling run spread exceeds 30%
  • Allocated: Heap memory allocated per operation
    • - = Zero allocations (ideal!)

Benchmarks are automatically run on every push to main.