Skip to main content

Benchmark Results

How Dekaf compares to Confluent.Kafka, measured with BenchmarkDotNet in daily or on-demand GitHub Actions runs from main.

Last Updated: 2026-08-16 14:42 UTC

At a glance

Each scenario is the median Dekaf-vs-Confluent result over the last 10 benchmark runs (both clients measured on the same runner), aggregated across its parameter configurations. Memory compares heap allocations per operation from the latest run.

The charts use the representative high-load parameter set from the latest run and show its measured values. Multipliers in brackets are calculated from those displayed figures; the table below summarizes the broader cross-run range.

Reading producer results

The linger=0 scenario is the matched client comparison. The linger=5 ms scenario intentionally measures each client's app-limited batching policy and should not be read as general producer throughput. Legacy serial-awaited rows, when present, send a sole Dekaf record immediately while Confluent applies the configured linger; the old benchmark's unused BatchSize parameter also duplicated each payload result. Legacy batch and fire-and-forget rows, when present, use acks=all with idempotence for Dekaf and acks=leader without idempotence for Confluent.

Latest run · representative high-load caseExecution timeMeasured time per benchmark operation; shorter bars are better.

Bars are scaled within each scenario for a direct client-to-client comparison.

Latest run · bytes per operationManaged allocationsManaged heap bytes allocated per operation; shorter bars are better.

Bars are scaled within each scenario for a direct client-to-client comparison.

ScenarioSpeed vs ConfluentMemory vs ConfluentConfidence
Produce — serial awaited (linger=5 ms; legacy)21×–22× faster3.3× less⚠ Noisy
Produce — batches (legacy: Dekaf acks=all/idempotent; Confluent acks=leader/non-idempotent)on par to 2.4× faster25× lessMixed
Produce — fire-and-forget (legacy: Dekaf acks=all/idempotent; Confluent acks=leader/non-idempotent)on par1000× lessMixed
Consume — drain a topic1.8× slower to 1.2× faster1.6× lessMixed
Consume — poll a single message3.7×–9.8× 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.141.01–1.2924%Stable
ConsumerBenchmarks.ConsumeAllMessageCount: 100, MessageSize: 1000101.301.09–1.5132%⚠ Low
ConsumerBenchmarks.ConsumeAllMessageCount: 1000, MessageSize: 100100.810.65–0.9739%⚠ Low
ConsumerBenchmarks.ConsumeAllMessageCount: 1000, MessageSize: 1000101.791.17–2.4069%⚠ Low
ConsumerPollBenchmarks.PollSinglePollsPerIteration: 400000, MessageSize: 100100.100.05–0.1156%⚠ Low
ConsumerPollBenchmarks.PollSinglePollsPerIteration: 400000, MessageSize: 1000100.270.26–0.70160%⚠ Low
ProducerBenchmarks.FireAndForgetMessageSize: 100, BatchSize: 100100.930.81–1.4872%⚠ Low
ProducerBenchmarks.FireAndForgetMessageSize: 100, BatchSize: 1000100.980.89–1.4759%⚠ Low
ProducerBenchmarks.FireAndForgetMessageSize: 1000, BatchSize: 100100.860.74–0.9828%Stable
ProducerBenchmarks.FireAndForgetMessageSize: 1000, BatchSize: 1000100.830.75–1.3167%⚠ Low
ProducerBenchmarks.ProduceBatchMessageSize: 100, BatchSize: 100100.440.43–0.444%Stable
ProducerBenchmarks.ProduceBatchMessageSize: 100, BatchSize: 1000100.500.48–0.516%Stable
ProducerBenchmarks.ProduceBatchMessageSize: 1000, BatchSize: 100100.420.40–0.5331%⚠ Low
ProducerBenchmarks.ProduceBatchMessageSize: 1000, BatchSize: 1000101.091.01–1.2825%Stable
ProducerBenchmarks.ProduceSingleMessageSize: 100, BatchSize: 100100.050.02–0.0682%⚠ Low
ProducerBenchmarks.ProduceSingleMessageSize: 100, BatchSize: 1000100.050.02–0.0681%⚠ Low
ProducerBenchmarks.ProduceSingleMessageSize: 1000, BatchSize: 100100.050.02–0.0683%⚠ Low
ProducerBenchmarks.ProduceSingleMessageSize: 1000, BatchSize: 1000100.050.02–0.0681%⚠ Low
Latest run — producer benchmarks
MethodCategoriesMessageSizeBatchSizeMeanErrorStdDevRatioRatioSDGen0Gen1AllocatedAlloc RatioConfidence
Confluent_ProduceBatchBatchProduce1001005,481.38 μs65.240 μs43.152 μs1.000.01--105170 B1.00Stable
Dekaf_ProduceBatchBatchProduce1001002,344.27 μs12.635 μs7.519 μs0.430.00--5344 B0.05Stable
Confluent_ProduceBatchBatchProduce10010006,384.55 μs83.715 μs49.817 μs1.000.0162.500023.43751048384 B1.00Stable
Dekaf_ProduceBatchBatchProduce10010003,224.80 μs120.425 μs79.654 μs0.510.01--49812 B0.05Stable
Confluent_ProduceBatchBatchProduce10001005,865.54 μs6.133 μs3.208 μs1.000.007.8125-194772 B1.00Stable
Dekaf_ProduceBatchBatchProduce10001002,441.00 μs47.392 μs31.347 μs0.420.01--6307 B0.03Stable
Confluent_ProduceBatchBatchProduce100010008,016.78 μs2,456.682 μs1,461.932 μs1.030.23109.375046.87501944394 B1.00Stable
Dekaf_ProduceBatchBatchProduce100010009,488.78 μs169.661 μs100.962 μs1.210.18--51720 B0.03Stable
Confluent_FireAndForgetFireAndForget10010058.71 μs2.676 μs1.770 μs1.000.041.7700-30400 B1.000Stable
Dekaf_FireAndForgetFireAndForget10010085.42 μs20.084 μs13.284 μs1.460.22--24 B0.001Stable
Confluent_FireAndForgetFireAndForget1001000570.86 μs33.310 μs22.033 μs1.000.0517.5781-304000 B1.000Stable
Dekaf_FireAndForgetFireAndForget1001000777.48 μs280.071 μs185.250 μs1.360.31--298 B0.001⚠ Low
Confluent_FireAndForgetFireAndForget1000100552.50 μs117.556 μs61.484 μs1.010.157.2021-120896 B1.000Stable
Dekaf_FireAndForgetFireAndForget1000100523.16 μs272.069 μs161.904 μs0.960.30--237 B0.002Stable
Confluent_FireAndForgetFireAndForget100010005,321.78 μs647.157 μs428.054 μs1.010.1170.3125-1206138 B1.000Stable
Dekaf_FireAndForgetFireAndForget100010007,098.98 μs2,794.574 μs1,663.006 μs1.340.32--1170 B0.001⚠ Low
Confluent_ProduceSingleSingleProduce1001005,271.37 μs8.384 μs4.385 μs1.000.00--1202 B1.00Stable
Dekaf_ProduceSingleSingleProduce100100116.84 μs4.220 μs2.791 μs0.020.00--456 B0.38Stable
Confluent_ProduceSingleSingleProduce10010005,290.59 μs52.814 μs27.623 μs1.000.01--1202 B1.00Stable
Dekaf_ProduceSingleSingleProduce1001000115.97 μs1.139 μs0.753 μs0.020.00--456 B0.38Stable
Confluent_ProduceSingleSingleProduce10001005,276.22 μs8.543 μs5.651 μs1.000.00--2113 B1.00Stable
Dekaf_ProduceSingleSingleProduce1000100118.39 μs2.593 μs1.543 μs0.020.00--456 B0.22Stable
Confluent_ProduceSingleSingleProduce100010005,277.37 μs5.620 μs3.344 μs1.000.00--2113 B1.00Stable
Dekaf_ProduceSingleSingleProduce10001000116.51 μs1.887 μs1.248 μs0.020.00--456 B0.22Stable
Latest run — consumer benchmarks
MethodMessageCountMessageSizeMeanErrorStdDevMedianRatioRatioSDAllocatedAlloc RatioConfidence
Confluent_ConsumeAll10010070.61 μs29.938 μs15.658 μs62.65 μs1.040.2864.99 KB1.00Stable
Dekaf_ConsumeAll10010063.39 μs2.645 μs1.384 μs63.77 μs0.930.1626.45 KB0.41Stable
Confluent_ConsumeAll100100068.54 μs3.923 μs1.399 μs68.52 μs1.000.03240.77 KB1.00Stable
Dekaf_ConsumeAll100100079.49 μs3.115 μs1.383 μs79.28 μs1.160.03202.23 KB0.84Stable
Confluent_ConsumeAll1000100609.14 μs316.950 μs165.771 μs563.88 μs1.060.36648.59 KB1.00⚠ Low
Dekaf_ConsumeAll1000100378.15 μs63.777 μs28.317 μs367.30 μs0.660.15258.48 KB0.40Stable
Confluent_ConsumeAll10001000683.96 μs385.912 μs171.347 μs577.48 μs1.050.332406.4 KB1.00⚠ Low
Dekaf_ConsumeAll10001000905.32 μs954.022 μs423.592 μs1,199.00 μs1.390.682016.3 KB0.84⚠ Low
MethodPollsPerIterationMessageSizeMeanErrorStdDevMedianRatioRatioSDGen0AllocatedAlloc RatioConfidence
Confluent_PollSingle4000001005,319.8 ns15.39 ns8.05 ns5,317.6 ns1.000.000.0375654 B1.00Stable
Dekaf_PollSingle400000100279.5 ns25.09 ns13.12 ns274.6 ns0.050.000.0150270 B0.41Stable
Confluent_PollSingle40000010001,536.3 ns1,709.02 ns1,130.41 ns794.4 ns1.461.320.14502454 B1.00⚠ Low
Dekaf_PollSingle4000001000613.1 ns205.59 ns135.98 ns552.5 ns0.580.300.12252074 B0.85Stable
Protocol serialization — Dekaf internals

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

MethodMeanErrorStdDevGen0Allocated
ReadDescribeGroupsV5580.13 ns13.871 ns3.602 ns0.07251224 B
WriteFindCoordinatorV627.57 ns0.253 ns0.039 ns--
WriteDescribeGroupsV645.52 ns0.245 ns0.038 ns--
WriteListConfigResourcesV120.78 ns0.138 ns0.036 ns--
MethodVersionMeanErrorStdDevAllocated
WriteRequest02.004 μs0.0229 μs0.0035 μs-
WriteRequest12.002 μs0.0019 μs0.0005 μs-
MethodVersionMeanErrorStdDevAllocated
WriteRequest82.395 μs0.0058 μs0.0009 μs-
WriteRequest92.604 μs0.0548 μs0.0085 μs-
WriteRequest102.413 μs0.0117 μs0.0030 μs-
WriteRequest112.411 μs0.0185 μs0.0048 μs-
MethodVersionMeanErrorStdDevAllocated
WriteOffsetCommitRequest9103.10 ns0.465 ns0.072 ns-
WriteOffsetFetchRequest9100.43 ns0.586 ns0.152 ns-
WriteOffsetCommitRequest1096.36 ns0.903 ns0.140 ns-
WriteOffsetFetchRequest1087.07 ns0.505 ns0.078 ns-
MethodMeanErrorStdDevGen0Allocated
'Write 1000 Int32s'1,640.0 ns2.93 ns1.75 ns--
'Write 100 Strings (100 chars)'2,059.3 ns2.87 ns1.71 ns--
'Write 100 Strings (300 chars)'2,310.4 ns4.74 ns2.82 ns--
'Write 100 String spans (300 chars)'2,284.1 ns3.77 ns2.24 ns--
'Write 100 CompactStrings'2,028.6 ns2.50 ns1.49 ns--
'Write 100 CompactStrings (300 chars)'3,891.2 ns10.47 ns6.23 ns--
'Write 100 CompactString spans (300 chars)'3,903.7 ns2.65 ns1.39 ns--
'Write 1000 VarInts'2,735.5 ns6.56 ns4.34 ns--
'Read 1000 Int32s'1,116.7 ns0.98 ns0.58 ns--
'Read 1000 VarInts'1,814.0 ns2.47 ns1.47 ns--
'Write RecordBatch (10 records)'774.0 ns1.58 ns1.05 ns--
'Write RecordBatch pre-serialized (10 records)'837.2 ns8.38 ns4.99 ns--
'Read RecordBatch (10 records)'144.2 ns0.48 ns0.25 ns--
'Read Gzip RecordBatch (10 records)'1,734.8 ns11.83 ns7.82 ns0.0172312 B
'Read + Iterate RecordBatch (10 records)'1,295.9 ns5.84 ns3.48 ns--
Serializers — Dekaf internals
MethodMeanErrorStdDevRatioRatioSDAllocatedAlloc Ratio
'Prepare stable generic Avro schema'3.646 ns0.0066 ns0.0058 ns1.000.00-NA
'Prepare equivalent generic Avro schema instance'234.849 ns0.1540 ns0.1366 ns64.410.11-NA
MethodMeanErrorStdDevAllocated
SerializeCached41.77 ns1.091 ns0.060 ns-
MethodCategoriesMeanErrorStdDevRatioRatioSDGen0AllocatedAlloc Ratio
'Serialize 100 Messages (key+value)'Batch9,386.595 ns3.7648 ns1.9691 ns??--?
'Serialize String (10 chars)'Scalar10.182 ns0.0209 ns0.0124 ns??--?
'Serialize String (100 chars)'Scalar12.055 ns0.0091 ns0.0060 ns??--?
'Serialize String (1000 chars)'Scalar26.905 ns0.2238 ns0.1332 ns??--?
'Deserialize String'Scalar26.912 ns0.4969 ns0.3287 ns??0.0026224 B?
'Serialize Int32'Scalar7.142 ns0.0227 ns0.0135 ns??--?
'ArrayBufferWriter + Copy'Writer91.927 ns1.7350 ns1.1476 ns1.000.020.0106896 B1.00
'ReusableBufferWriter Direct'Writer50.440 ns0.5176 ns0.3080 ns0.550.01--0.00
Compression — Dekaf internals
MethodMeanErrorStdDevGen0Allocated
'Snappy Compress 1KB'287.1 ns3.39 ns2.24 ns0.002948 B
'Snappy Compress 1MB'97,120.8 ns103.34 ns61.49 ns-48 B
'Snappy Decompress 1KB'221.0 ns0.79 ns0.52 ns0.004880 B
'Snappy Decompress 1MB'122,700.7 ns95.01 ns56.54 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 automatically run daily at 05:00 UTC from main and can also be run manually.