Skip to content

refactor(benchmarks): measure fixed workloads in milliseconds - #323

Merged
tisonkun merged 1 commit into
apache:mainfrom
tisonkun:codex/benchmark-fixed-workloads
Nov 4, 2026
Merged

tisonkun merged 1 commit into
apache:mainfrom
tisonkun:codex/benchmark-fixed-workloads

Conversation

@tisonkun

@tisonkun tisonkun commented Nov 4, 2026

Copy link
Copy Markdown
Member

Replace Divan's per-operation measurements with fixed workloads sized around hundreds of milliseconds, following Benchmark In Milliseconds. Each revision runs the same amount of work, so improvements reduce elapsed time instead of changing the workload size.

The runner measures fixture construction through cleanup and reports integer-millisecond medians, full ranges, and optional raw samples. XOR comparisons share round counts and rotate execution order across repetitions. Matched-build cases validate the resulting seeds directly, preserving equal construction attempt counts without building another implementation inside the measurement. All 279 existing operation, input, and implementation combinations are retained across 207 scenarios.

Add filtering, exact selection, repetition and round overrides, listing, compile-only, and smoke-test support through cargo x bench. Document timing boundaries and baseline maintenance, and run smoke tests in CI without timing assertions. These measurements establish a new baseline because setup and destruction are now included.

Validation:

  • cargo x check
  • cargo x test
  • cargo x lint in a clean source checkout
  • cargo x bench -- --test: all 279 combinations pass
  • cargo +1.86.0 check --package benchmarks --all-targets --locked
  • Three-repetition timing runs, including matched XOR comparisons and CPC serialization

@tisonkun

tisonkun commented Nov 4, 2026

Copy link
Copy Markdown
Member Author

Fixed-workload baseline

Baseline for commit 70c2117, measured on 2026-11-04. This is a fresh full run of the committed benchmark definitions: 207 scenarios, 279 scenario/implementation combinations, three repetitions each. The results below retain all three measurements, including the first run and outliers.

Environment: Apple M4 Max, 36 GiB RAM, macOS 26.6.2 (arm64); rustc 1.101.0-nightly (8006091eb 2026-10-17), LLVM 23.1.4; Cargo's optimized bench profile.

Reproduce at the same revision with:

cargo x bench -- --repeat 3 --raw

The round counts are the committed defaults, with no automatic calibration or round override. Each round executes the complete workload closure; input sizes and inner batches are unchanged. The clock includes fixture construction, per-round input cloning where needed, result destruction, and cleanup. XOR peers share rounds and rotate execution order; matched-build cases check each constructed filter's expected seed directly.

200 of 207 reference medians fall between 100 and 999 ms. Shorter results are retained as measured; equivalent faster strategies are not resized independently. Different scenario rows can have different work sizes, so the ranges below are a sizing overview, not a throughput ranking. This establishes a baseline for future revisions, not a before/after speedup claim or a timing threshold for CI. Old Divan numbers use different timing boundaries and should not be compared directly.

Sketch Scenarios Implementation rows Reference medians (ms)
bloom 3 3 236–328
countmin 7 7 256–332
cpc 6 6 244–382
frequencies 2 2 232–319
hll 22 22 185–686
kll 12 12 199–323
req 8 8 184–400
tdigest 89 89 15–764
theta 2 2 286–324
tuple 2 2 286–342
xor 54 126 272–375

All elapsed times below are integer milliseconds. Runs preserves measurement order; vs ref is the implementation median divided by the scenario's reference median before millisecond rounding. For example, 0.80x means 20% less elapsed time for the same workload. In XOR build tables, distinct and deduplicate are DataSketches entry points; xorf is xorf 0.13.0.

bloom: 3 scenarios, 3 implementation rows
Scenario Implementation Rounds Median ms Min–max ms Runs (ms) vs ref
bloom::update::u64 DataSketches 2000 328 328–328 328, 328, 328 1.00x
bloom::update::bytes_32 DataSketches 1000 236 235–236 236, 236, 235 1.00x
bloom::update::contains_and_insert_present_u64 DataSketches 2000 256 255–257 255, 256, 257 1.00x
countmin: 7 scenarios, 7 implementation rows
Scenario Implementation Rounds Median ms Min–max ms Runs (ms) vs ref
countmin::decay::u64/0.5 DataSketches 20000 288 286–292 292, 286, 288 1.00x
countmin::decay::u64/0.99 DataSketches 10000 292 291–294 291, 294, 292 1.00x
countmin::decay::u64/1.0 DataSketches 50000 326 326–329 329, 326, 326 1.00x
countmin::estimate::u64 DataSketches 2000 332 329–338 329, 332, 338 1.00x
countmin::estimate::bytes_32 DataSketches 1000 256 255–260 256, 260, 255 1.00x
countmin::update::u64 DataSketches 2000 288 288–289 288, 288, 289 1.00x
countmin::update::bytes_32 DataSketches 1000 261 260–267 260, 267, 261 1.00x
cpc: 6 scenarios, 6 implementation rows
Scenario Implementation Rounds Median ms Min–max ms Runs (ms) vs ref
cpc::serde::serialize/200 DataSketches 400000 382 377–382 382, 382, 377 1.00x
cpc::serde::serialize/8000 DataSketches 500000 376 373–378 373, 376, 378 1.00x
cpc::serde::deserialize/200 DataSketches 400000 356 353–361 356, 361, 353 1.00x
cpc::serde::deserialize/8000 DataSketches 100000 244 244–244 244, 244, 244 1.00x
cpc::update::u64 DataSketches 3000 353 351–357 357, 353, 351 1.00x
cpc::update::bytes_32 DataSketches 2000 278 277–279 279, 277, 278 1.00x
frequencies: 2 scenarios, 2 implementation rows
Scenario Implementation Rounds Median ms Min–max ms Runs (ms) vs ref
frequencies::update::u64 DataSketches 2000 232 218–239 239, 232, 218 1.00x
frequencies::update::bytes_32 DataSketches 900 319 319–323 319, 323, 319 1.00x
hll: 22 scenarios, 22 implementation rows
Scenario Implementation Rounds Median ms Min–max ms Runs (ms) vs ref
hll::serde::serialize_union/0 DataSketches 15000000 311 307–314 314, 311, 307 1.00x
hll::serde::serialize_union/4 DataSketches 12000000 266 262–268 266, 262, 268 1.00x
hll::serde::serialize_union/100 DataSketches 2000000 342 340–348 340, 348, 342 1.00x
hll::serde::serialize_union/80000 DataSketches 90000 308 305–319 319, 305, 308 1.00x
hll::serde::serialize_union_via_sketch/0 DataSketches 15000000 686 676–687 687, 676, 686 1.00x
hll::serde::serialize_union_via_sketch/4 DataSketches 12000000 574 564–574 564, 574, 574 1.00x
hll::serde::serialize_union_via_sketch/100 DataSketches 2000000 419 412–423 412, 419, 423 1.00x
hll::serde::serialize_union_via_sketch/80000 DataSketches 90000 625 616–637 637, 616, 625 1.00x
hll::union::empty_from_dense/12 DataSketches 2000000 185 184–188 185, 184, 188 1.00x
hll::union::empty_from_dense/18 DataSketches 70000 242 241–243 242, 241, 243 1.00x
hll::union::recreated_small_partials/12 DataSketches 500 320 318–324 320, 318, 324 1.00x
hll::union::recreated_small_partials/18 DataSketches 90 312 308–314 314, 312, 308 1.00x
hll::union::persistent_small_partials/12 DataSketches 500 271 268–277 277, 271, 268 1.00x
hll::union::persistent_small_partials/18 DataSketches 300 313 312–320 320, 312, 313 1.00x
hll::union::dense_partials/12 DataSketches 80000 329 329–329 329, 329, 329 1.00x
hll::union::dense_partials/18 DataSketches 700 218 217–219 218, 219, 217 1.00x
hll::union::dense_partials_with_queries/12 DataSketches 7000 336 334–337 336, 334, 337 1.00x
hll::union::dense_partials_with_queries/18 DataSketches 60 320 320–320 320, 320, 320 1.00x
hll::union::downsampled_dense_partials/12 DataSketches 6000 255 251–259 255, 251, 259 1.00x
hll::union::downsampled_dense_partials/18 DataSketches 80 290 273–296 296, 290, 273 1.00x
hll::update::u64 DataSketches 6000 278 275–287 287, 278, 275 1.00x
hll::update::bytes_32 DataSketches 2000 253 252–256 256, 252, 253 1.00x
kll: 12 scenarios, 12 implementation rows
Scenario Implementation Rounds Median ms Min–max ms Runs (ms) vs ref
kll::merge::merge DataSketches 70000 299 286–303 299, 303, 286 1.00x
kll::query::rank DataSketches 7000000 290 290–291 290, 290, 291 1.00x
kll::query::quantile/0.0 DataSketches 100000000 320 320–323 323, 320, 320 1.00x
kll::query::quantile/0.5 DataSketches 100000 241 240–250 241, 240, 250 1.00x
kll::query::quantile/1.0 DataSketches 100000000 323 321–325 321, 325, 323 1.00x
kll::query::sorted_view_quantile DataSketches 40000000 280 279–280 280, 280, 279 1.00x
kll::query::batch_quantiles DataSketches 100000 264 255–264 264, 264, 255 1.00x
kll::serde::serialize DataSketches 200000 262 261–265 265, 262, 261 1.00x
kll::serde::deserialize DataSketches 100000 199 194–201 201, 199, 194 1.00x
kll::update::update/1000 DataSketches 30000 287 280–296 280, 287, 296 1.00x
kll::update::update/10000 DataSketches 2000 299 298–304 304, 298, 299 1.00x
kll::update::update/100000 DataSketches 100 249 243–250 249, 250, 243 1.00x
req: 8 scenarios, 8 implementation rows
Scenario Implementation Rounds Median ms Min–max ms Runs (ms) vs ref
req::query::rank DataSketches 6000000 302 300–306 306, 302, 300 1.00x
req::query::quantile/0.0 DataSketches 100000000 323 322–390 390, 322, 323 1.00x
req::query::quantile/0.5 DataSketches 30000 324 321–324 324, 321, 324 1.00x
req::query::quantile/1.0 DataSketches 100000000 324 321–326 321, 324, 326 1.00x
req::query::sorted_view_quantile DataSketches 30000000 184 183–203 183, 184, 203 1.00x
req::update::update/1000 DataSketches 20000 264 262–274 274, 262, 264 1.00x
req::update::update/10000 DataSketches 2000 352 348–357 357, 352, 348 1.00x
req::update::update/100000 DataSketches 200 400 399–401 399, 400, 401 1.00x
tdigest: 89 scenarios, 89 implementation rows
Scenario Implementation Rounds Median ms Min–max ms Runs (ms) vs ref
tdigest::aggregation::serialized_borrowed/(1, 8) DataSketches 2000000 308 307–336 336, 307, 308 1.00x
tdigest::aggregation::serialized_borrowed/(64, 8) DataSketches 9000 287 285–290 285, 290, 287 1.00x
tdigest::aggregation::serialized_borrowed/(512, 8) DataSketches 800 283 277–292 292, 283, 277 1.00x
tdigest::aggregation::serialized_borrowed/(64, 64) DataSketches 5000 325 321–326 321, 326, 325 1.00x
tdigest::aggregation::serialized_borrowed/(512, 64) DataSketches 300 287 267–294 287, 267, 294 1.00x
tdigest::aggregation::serialized_borrowed/(64, 4096) DataSketches 2000 254 251–257 254, 251, 257 1.00x
tdigest::aggregation::serialized_owned/(1, 8) DataSketches 2000000 267 267–270 270, 267, 267 1.00x
tdigest::aggregation::serialized_owned/(64, 8) DataSketches 9000 85 84–85 85, 84, 85 1.00x
tdigest::aggregation::serialized_owned/(512, 8) DataSketches 800 77 73–81 81, 77, 73 1.00x
tdigest::aggregation::serialized_owned/(64, 64) DataSketches 5000 268 267–269 268, 267, 269 1.00x
tdigest::aggregation::serialized_owned/(512, 64) DataSketches 300 411 405–414 414, 411, 405 1.00x
tdigest::aggregation::serialized_owned/(64, 4096) DataSketches 2000 515 481–529 481, 529, 515 1.00x
tdigest::aggregation::serialized_in_batches/(1, 8) DataSketches 2000000 328 327–329 329, 327, 328 1.00x
tdigest::aggregation::serialized_in_batches/(64, 8) DataSketches 9000 110 109–112 110, 109, 112 1.00x
tdigest::aggregation::serialized_in_batches/(512, 8) DataSketches 800 81 81–86 86, 81, 81 1.00x
tdigest::aggregation::serialized_in_batches/(64, 64) DataSketches 5000 234 233–234 234, 233, 234 1.00x
tdigest::aggregation::serialized_in_batches/(512, 64) DataSketches 300 200 200–200 200, 200, 200 1.00x
tdigest::aggregation::serialized_in_batches/(64, 4096) DataSketches 2000 333 321–339 339, 333, 321 1.00x
tdigest::aggregation::end_to_end_borrowed/8 DataSketches 8000 306 306–311 306, 311, 306 1.00x
tdigest::aggregation::end_to_end_borrowed/64 DataSketches 3000 362 356–364 364, 362, 356 1.00x
tdigest::aggregation::end_to_end_owned/8 DataSketches 8000 127 126–128 128, 127, 126 1.00x
tdigest::aggregation::end_to_end_owned/64 DataSketches 3000 322 321–330 322, 321, 330 1.00x
tdigest::compress::initial_buffer DataSketches 20000 337 336–338 337, 338, 336 1.00x
tdigest::compress::unmerged_tail DataSketches 10000 293 292–293 293, 292, 293 1.00x
tdigest::compress::freeze_initial_buffer DataSketches 20000 337 337–337 337, 337, 337 1.00x
tdigest::merge::merge DataSketches 150000 309 307–309 309, 307, 309 1.00x
tdigest::merge::unmerged/8 DataSketches 20000 343 341–344 341, 344, 343 1.00x
tdigest::merge::unmerged/1640 DataSketches 8000 308 308–308 308, 308, 308 1.00x
tdigest::merge::small_partials DataSketches 10000 228 228–229 229, 228, 228 1.00x
tdigest::merge::partials DataSketches 7000 320 319–321 319, 320, 321 1.00x
tdigest::merge::partials_from_iter DataSketches 20000 411 407–417 407, 411, 417 1.00x
tdigest::merge::partials_from_iter_cloned DataSketches 20000 432 428–432 432, 432, 428 1.00x
tdigest::merge::partials_from_iter_finalize/0 DataSketches 10000 205 204–206 206, 204, 205 1.00x
tdigest::merge::partials_from_iter_finalize/64 DataSketches 10000 225 225–225 225, 225, 225 1.00x
tdigest::merge::partials_from_iter_finalize/4096 DataSketches 3000 334 333–336 333, 334, 336 1.00x
tdigest::merge::uncompressed_partials_from_iter DataSketches 6000 311 309–311 311, 309, 311 1.00x
tdigest::merge::serialized_partials/8 DataSketches 10000 266 265–268 268, 266, 265 1.00x
tdigest::merge::serialized_partials/64 DataSketches 6000 336 333–339 333, 339, 336 1.00x
tdigest::merge::serialized_overlapping_partials DataSketches 5000 320 318–322 322, 320, 318 1.00x
tdigest::merge::serialized_partials_from_iter/false DataSketches 10000 287 283–287 287, 287, 283 1.00x
tdigest::merge::serialized_partials_from_iter/true DataSketches 6000 316 315–322 315, 322, 316 1.00x
tdigest::merge::serialized_partials_in_batches/false DataSketches 9000 316 315–317 315, 316, 317 1.00x
tdigest::merge::serialized_partials_in_batches/true DataSketches 7000 327 324–330 324, 330, 327 1.00x
tdigest::query::rank DataSketches 10000000 248 247–248 248, 248, 247 1.00x
tdigest::query::rank_mixed DataSketches 40000 278 276–279 278, 276, 279 1.00x
tdigest::query::rank_small/0.0 DataSketches 80000000 333 328–339 339, 333, 328 1.00x
tdigest::query::rank_small/2.5 DataSketches 80000000 474 473–504 473, 474, 504 1.00x
tdigest::query::rank_small/5.0 DataSketches 50000000 321 314–324 314, 324, 321 1.00x
tdigest::query::rank_mut DataSketches 9000000 232 231–236 236, 232, 231 1.00x
tdigest::query::rank_repeated_means/0.0 DataSketches 20000000 358 358–359 358, 359, 358 1.00x
tdigest::query::rank_repeated_means/3.0 DataSketches 10000000 243 243–245 243, 243, 245 1.00x
tdigest::query::rank_repeated_means/3.5 DataSketches 10000000 221 220–221 221, 221, 220 1.00x
tdigest::query::rank_repeated_means/7.0 DataSketches 7000000 309 309–309 309, 309, 309 1.00x
tdigest::query::quantile DataSketches 4000000 301 298–302 301, 302, 298 1.00x
tdigest::query::cdf_100 DataSketches 600000 258 256–259 256, 258, 259 1.00x
tdigest::query::pmf/1 DataSketches 5000000 237 236–237 237, 236, 237 1.00x
tdigest::query::pmf/6 DataSketches 2000000 270 270–272 270, 272, 270 1.00x
tdigest::query::pmf/100 DataSketches 600000 268 266–274 266, 274, 268 1.00x
tdigest::query::pmf/512 DataSketches 100000 209 205–210 210, 209, 205 1.00x
tdigest::query::quantiles_sequential<true>/2 DataSketches 2000000 300 298–302 302, 300, 298 1.00x
tdigest::query::quantiles_sequential<true>/6 DataSketches 700000 305 304–310 305, 304, 310 1.00x
tdigest::query::quantiles_sequential<true>/100 DataSketches 40000 293 293–293 293, 293, 293 1.00x
tdigest::query::quantiles_sequential<false>/2 DataSketches 2000000 304 303–304 303, 304, 304 1.00x
tdigest::query::quantiles_sequential<false>/6 DataSketches 700000 313 312–314 314, 313, 312 1.00x
tdigest::query::quantiles_sequential<false>/100 DataSketches 40000 295 294–295 295, 295, 294 1.00x
tdigest::query::quantiles_batch<true>/2 DataSketches 2000000 203 202–203 202, 203, 203 1.00x
tdigest::query::quantiles_batch<true>/6 DataSketches 700000 78 78–78 78, 78, 78 1.00x
tdigest::query::quantiles_batch<true>/100 DataSketches 40000 15 15–15 15, 15, 15 1.00x
tdigest::query::quantiles_batch<false>/2 DataSketches 2000000 249 248–250 248, 250, 249 1.00x
tdigest::query::quantiles_batch<false>/6 DataSketches 700000 98 98–100 98, 100, 98 1.00x
tdigest::query::quantiles_batch<false>/100 DataSketches 40000 36 36–36 36, 36, 36 1.00x
tdigest::serde::small_lifecycle/1 DataSketches 7000000 310 310–315 315, 310, 310 1.00x
tdigest::serde::small_lifecycle/2 DataSketches 6000000 337 337–339 339, 337, 337 1.00x
tdigest::serde::small_lifecycle/8 DataSketches 2000000 169 168–169 168, 169, 169 1.00x
tdigest::serde::small_lifecycle/32 DataSketches 2000000 764 762–773 762, 764, 773 1.00x
tdigest::serde::small_lifecycle/64 DataSketches 500000 404 403–404 404, 404, 403 1.00x
tdigest::serde::small_lifecycle/128 DataSketches 200000 293 292–295 292, 295, 293 1.00x
tdigest::serde::partial_lifecycle_by_k/10 DataSketches 400000 367 364–367 364, 367, 367 1.00x
tdigest::serde::partial_lifecycle_by_k/200 DataSketches 500000 409 409–409 409, 409, 409 1.00x
tdigest::serde::serialize_small_partial_groups DataSketches 10000 280 275–282 275, 280, 282 1.00x
tdigest::serde::deserialize_small_partial_groups DataSketches 10000 228 225–245 245, 225, 228 1.00x
tdigest::serde::serialize_partial_groups DataSketches 4000 318 318–320 318, 320, 318 1.00x
tdigest::serde::deserialize_partial_groups DataSketches 4000 332 332–332 332, 332, 332 1.00x
tdigest::update::update/1000 DataSketches 20000 274 273–275 274, 273, 275 1.00x
tdigest::update::update/100000 DataSketches 100 272 269–279 279, 272, 269 1.00x
tdigest::update::small_partial_groups_update DataSketches 20000 340 339–342 340, 339, 342 1.00x
tdigest::update::small_partial_groups_update_two_states DataSketches 20000 683 666–686 666, 686, 683 1.00x
tdigest::update::partial_groups_update DataSketches 2000 292 292–306 306, 292, 292 1.00x
tdigest::update::partial_groups_update_two_states DataSketches 2000 412 410–415 412, 415, 410 1.00x
theta: 2 scenarios, 2 implementation rows
Scenario Implementation Rounds Median ms Min–max ms Runs (ms) vs ref
theta::update::u64 DataSketches 4000 286 279–299 286, 299, 279 1.00x
theta::update::bytes_32 DataSketches 3000 324 324–328 324, 324, 328 1.00x
tuple: 2 scenarios, 2 implementation rows
Scenario Implementation Rounds Median ms Min–max ms Runs (ms) vs ref
tuple::update::u64 DataSketches 4000 286 262–287 262, 287, 286 1.00x
tuple::update::bytes_32 DataSketches 3000 342 338–346 346, 338, 342 1.00x
xor: 54 scenarios, 126 implementation rows
Scenario Implementation Rounds Median ms Min–max ms Runs (ms) vs ref
xor::build::8/1000 distinct 60000 306 305–308 306, 305, 308 1.00x
xor::build::8/1000 deduplicate 60000 579 578–588 579, 588, 578 1.89x
xor::build::8/1000 xorf 60000 471 466–472 472, 471, 466 1.54x
xor::build::8/16384 distinct 2000 362 359–366 359, 366, 362 1.00x
xor::build::8/16384 deduplicate 2000 570 566–584 584, 566, 570 1.58x
xor::build::8/16384 xorf 2000 286 282–300 300, 286, 282 0.79x
xor::build::8/49999 distinct 600 287 277–296 277, 287, 296 1.00x
xor::build::8/49999 deduplicate 600 556 552–563 552, 563, 556 1.94x
xor::build::8/49999 xorf 600 370 350–373 373, 350, 370 1.29x
xor::build::8/50000 distinct 600 292 281–302 292, 281, 302 1.00x
xor::build::8/50000 deduplicate 600 572 567–580 567, 580, 572 1.96x
xor::build::8/50000 xorf 600 350 349–380 350, 349, 380 1.20x
xor::build::8/50001 distinct 600 305 301–315 305, 315, 301 1.00x
xor::build::8/50001 deduplicate 600 586 583–852 586, 852, 583 1.92x
xor::build::8/50001 xorf 600 398 386–1078 386, 1078, 398 1.30x
xor::build::8/100000 distinct 200 272 272–279 272, 279, 272 1.00x
xor::build::8/100000 deduplicate 200 460 448–463 460, 463, 448 1.69x
xor::build::8/100000 xorf 200 300 293–310 293, 300, 310 1.10x
xor::build::16/1000 distinct 60000 304 301–305 305, 304, 301 1.00x
xor::build::16/1000 deduplicate 60000 577 570–579 577, 570, 579 1.90x
xor::build::16/1000 xorf 60000 468 467–469 467, 468, 469 1.54x
xor::build::16/16384 distinct 2000 359 357–366 359, 357, 366 1.00x
xor::build::16/16384 deduplicate 2000 559 558–560 558, 559, 560 1.56x
xor::build::16/16384 xorf 2000 283 282–283 283, 282, 283 0.79x
xor::build::16/49999 distinct 600 298 291–315 298, 291, 315 1.00x
xor::build::16/49999 deduplicate 600 575 572–580 572, 580, 575 1.93x
xor::build::16/49999 xorf 600 344 343–363 363, 343, 344 1.15x
xor::build::16/50000 distinct 600 296 293–309 293, 296, 309 1.00x
xor::build::16/50000 deduplicate 600 563 554–592 563, 592, 554 1.90x
xor::build::16/50000 xorf 600 359 342–367 359, 367, 342 1.21x
xor::build::16/50001 distinct 600 294 293–316 294, 293, 316 1.00x
xor::build::16/50001 deduplicate 600 552 544–586 544, 552, 586 1.87x
xor::build::16/50001 xorf 600 330 327–345 327, 330, 345 1.12x
xor::build::16/100000 distinct 200 284 283–301 284, 283, 301 1.00x
xor::build::16/100000 deduplicate 200 459 458–496 458, 459, 496 1.62x
xor::build::16/100000 xorf 200 308 295–320 308, 320, 295 1.09x
xor::build::32/1000 distinct 60000 314 312–315 312, 314, 315 1.00x
xor::build::32/1000 deduplicate 60000 583 583–586 583, 583, 586 1.86x
xor::build::32/1000 xorf 60000 469 467–469 467, 469, 469 1.49x
xor::build::32/16384 distinct 2000 370 363–370 370, 363, 370 1.00x
xor::build::32/16384 deduplicate 2000 570 569–578 570, 569, 578 1.54x
xor::build::32/16384 xorf 2000 286 283–288 286, 283, 288 0.77x
xor::build::32/49999 distinct 600 300 292–311 311, 300, 292 1.00x
xor::build::32/49999 deduplicate 600 578 569–580 569, 580, 578 1.93x
xor::build::32/49999 xorf 600 346 332–373 346, 373, 332 1.15x
xor::build::32/50000 distinct 600 295 288–299 295, 288, 299 1.00x
xor::build::32/50000 deduplicate 600 555 549–581 555, 581, 549 1.88x
xor::build::32/50000 xorf 600 340 334–347 347, 334, 340 1.15x
xor::build::32/50001 distinct 600 304 291–308 308, 291, 304 1.00x
xor::build::32/50001 deduplicate 600 551 542–594 542, 594, 551 1.81x
xor::build::32/50001 xorf 600 348 342–366 342, 366, 348 1.15x
xor::build::32/100000 distinct 200 272 271–288 272, 288, 271 1.00x
xor::build::32/100000 deduplicate 200 462 450–468 462, 468, 450 1.70x
xor::build::32/100000 xorf 200 304 298–322 304, 322, 298 1.12x
xor::matched_build::8/(1000, 0) DataSketches 60000 302 301–303 303, 302, 301 1.00x
xor::matched_build::8/(1000, 0) xorf 60000 465 464–466 465, 466, 464 1.54x
xor::matched_build::8/(16384, 0) DataSketches 3000 307 305–309 309, 305, 307 1.00x
xor::matched_build::8/(16384, 0) xorf 3000 414 413–418 413, 414, 418 1.35x
xor::matched_build::8/(16384, 917504) DataSketches 2000 360 355–361 361, 360, 355 1.00x
xor::matched_build::8/(16384, 917504) xorf 2000 495 489–503 503, 489, 495 1.37x
xor::matched_build::8/(49999, 0) DataSketches 600 280 276–286 280, 286, 276 1.00x
xor::matched_build::8/(49999, 0) xorf 600 362 351–372 372, 351, 362 1.29x
xor::matched_build::8/(50000, 0) DataSketches 600 288 271–297 271, 297, 288 1.00x
xor::matched_build::8/(50000, 0) xorf 600 370 337–382 337, 370, 382 1.29x
xor::matched_build::8/(50001, 0) DataSketches 600 304 293–305 304, 305, 293 1.00x
xor::matched_build::8/(50001, 0) xorf 600 369 365–375 369, 375, 365 1.21x
xor::matched_build::8/(100000, 0) DataSketches 200 275 274–278 278, 274, 275 1.00x
xor::matched_build::8/(100000, 0) xorf 200 302 298–306 302, 298, 306 1.10x
xor::matched_build::8/(8000000, 0) DataSketches 1 317 315–349 349, 315, 317 1.00x
xor::matched_build::8/(8000000, 0) xorf 1 366 329–503 503, 366, 329 1.16x
xor::matched_build::16/(1000, 0) DataSketches 60000 304 303–306 306, 304, 303 1.00x
xor::matched_build::16/(1000, 0) xorf 60000 471 468–472 471, 472, 468 1.55x
xor::matched_build::16/(16384, 0) DataSketches 3000 314 309–315 314, 315, 309 1.00x
xor::matched_build::16/(16384, 0) xorf 3000 425 416–447 416, 425, 447 1.35x
xor::matched_build::16/(16384, 917504) DataSketches 2000 362 357–364 362, 364, 357 1.00x
xor::matched_build::16/(16384, 917504) xorf 2000 519 499–522 522, 499, 519 1.43x
xor::matched_build::16/(49999, 0) DataSketches 600 280 273–293 293, 280, 273 1.00x
xor::matched_build::16/(49999, 0) xorf 600 333 326–346 333, 326, 346 1.19x
xor::matched_build::16/(50000, 0) DataSketches 600 283 282–286 286, 283, 282 1.00x
xor::matched_build::16/(50000, 0) xorf 600 337 319–341 341, 319, 337 1.19x
xor::matched_build::16/(50001, 0) DataSketches 600 309 298–310 310, 309, 298 1.00x
xor::matched_build::16/(50001, 0) xorf 600 359 354–364 359, 364, 354 1.16x
xor::matched_build::16/(100000, 0) DataSketches 200 282 279–285 282, 285, 279 1.00x
xor::matched_build::16/(100000, 0) xorf 200 314 296–323 323, 314, 296 1.12x
xor::matched_build::16/(8000000, 0) DataSketches 1 331 312–336 336, 331, 312 1.00x
xor::matched_build::16/(8000000, 0) xorf 1 364 345–404 404, 364, 345 1.10x
xor::matched_build::32/(1000, 0) DataSketches 60000 315 309–315 315, 309, 315 1.00x
xor::matched_build::32/(1000, 0) xorf 60000 469 468–472 468, 469, 472 1.49x
xor::matched_build::32/(16384, 0) DataSketches 3000 319 314–324 324, 319, 314 1.00x
xor::matched_build::32/(16384, 0) xorf 3000 420 417–428 417, 420, 428 1.32x
xor::matched_build::32/(16384, 917504) DataSketches 2000 375 364–375 364, 375, 375 1.00x
xor::matched_build::32/(16384, 917504) xorf 2000 507 504–548 548, 504, 507 1.35x
xor::matched_build::32/(49999, 0) DataSketches 600 296 286–302 302, 286, 296 1.00x
xor::matched_build::32/(49999, 0) xorf 600 336 329–352 336, 329, 352 1.14x
xor::matched_build::32/(50000, 0) DataSketches 600 326 293–339 326, 339, 293 1.00x
xor::matched_build::32/(50000, 0) xorf 600 367 354–400 400, 367, 354 1.13x
xor::matched_build::32/(50001, 0) DataSketches 600 301 297–310 301, 297, 310 1.00x
xor::matched_build::32/(50001, 0) xorf 600 349 344–366 349, 344, 366 1.16x
xor::matched_build::32/(100000, 0) DataSketches 200 283 276–285 283, 285, 276 1.00x
xor::matched_build::32/(100000, 0) xorf 200 320 300–324 320, 300, 324 1.13x
xor::matched_build::32/(8000000, 0) DataSketches 1 354 341–367 354, 341, 367 1.00x
xor::matched_build::32/(8000000, 0) xorf 1 395 349–517 517, 395, 349 1.12x
xor::query::8_present/16384 DataSketches 10000 316 314–317 314, 316, 317 1.00x
xor::query::8_present/16384 xorf 10000 283 283–294 283, 283, 294 0.90x
xor::query::8_present/50000 DataSketches 3000 292 289–300 289, 300, 292 1.00x
xor::query::8_present/50000 xorf 3000 255 253–256 256, 255, 253 0.87x
xor::query::8_absent/16384 DataSketches 10000 317 313–318 317, 318, 313 1.00x
xor::query::8_absent/16384 xorf 10000 281 281–282 282, 281, 281 0.89x
xor::query::8_absent/50000 DataSketches 3000 289 288–289 289, 288, 289 1.00x
xor::query::8_absent/50000 xorf 3000 255 251–255 255, 255, 251 0.88x
xor::query::16_present/16384 DataSketches 10000 350 349–357 350, 349, 357 1.00x
xor::query::16_present/16384 xorf 10000 282 282–284 282, 284, 282 0.81x
xor::query::16_present/50000 DataSketches 3000 327 325–329 327, 329, 325 1.00x
xor::query::16_present/50000 xorf 3000 268 268–268 268, 268, 268 0.82x
xor::query::16_absent/16384 DataSketches 10000 346 343–355 355, 346, 343 1.00x
xor::query::16_absent/16384 xorf 10000 283 278–284 284, 283, 278 0.82x
xor::query::16_absent/50000 DataSketches 3000 327 322–328 322, 328, 327 1.00x
xor::query::16_absent/50000 xorf 3000 268 263–276 276, 263, 268 0.82x
xor::query::32_present/16384 DataSketches 10000 333 330–338 333, 338, 330 1.00x
xor::query::32_present/16384 xorf 10000 278 278–279 278, 278, 279 0.84x
xor::query::32_present/50000 DataSketches 3000 342 340–343 340, 342, 343 1.00x
xor::query::32_present/50000 xorf 3000 303 300–304 303, 300, 304 0.89x
xor::query::32_absent/16384 DataSketches 10000 331 331–335 335, 331, 331 1.00x
xor::query::32_absent/16384 xorf 10000 279 278–281 278, 279, 281 0.84x
xor::query::32_absent/50000 DataSketches 3000 343 342–344 343, 342, 344 1.00x
xor::query::32_absent/50000 xorf 3000 299 299–304 299, 299, 304 0.87x

@tisonkun
tisonkun merged commit 33ec5c9 into apache:main Nov 4, 2026
10 checks passed
@tisonkun
tisonkun deleted the codex/benchmark-fixed-workloads branch November 4, 2026 14:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant