Arrow Release Benchmark Report

Benchmark Run Summary

Run Type1 Commit SHA Time of Commit Hardware Languages Benchmark Type Number of Benchmarks
2023-08-17 08:01:24 Intel(R) Core(TM) i9-9960X CPU @ 3.10GHz Python, R 218
2023-10-19 09:12:19 Intel(R) Core(TM) i9-9960X CPU @ 3.10GHz Python, R 194
2023-08-17 08:01:24 AMD Ryzen 5 PRO 4650GE with Radeon Graphics C++, Java 3384
2023-10-19 09:12:19 AMD Ryzen 5 PRO 4650GE with Radeon Graphics C++, Java 3368
2023-08-17 08:01:24 Intel(R) Core(TM) i9-9960X CPU @ 3.10GHz JavaScript 88
1 When we compare benchmark results, we always have a contender (the new code that we are considering) and a baseline (the old code that were are comparing to). The historic distribution will be drawn from all benchmark results on commits in the baseline commit's git ancestry, up to and including all runs on the baseline commit itself. In this context, a baseline is typically the last Arrow release and the contender is the current release candidate.

Macrobenchmarks

Live Conbench UI views for the macrobenchmarks are available at this url. Conbench is an additional method to explore the results of the benchmarks particularly if you want to see results from more of the history or see more metadata.

Benchmark Percent Changes

  • Benchmarks are plotted using the percent change from baseline to contender.
  • Additional information on each benchmark is available by hovering over the relevant bar.

Python

dataframe-to-table

dataset-filter

dataset-read

dataset-select

dataset-selectivity

file-read

file-write

recursive-get-file-info

wide-dataframe

R

dataframe-to-table

file-read

file-write

partitioned-dataset-filter

tpch

Microbenchmarks

There are currently 3301 microbenchmarks in the Arrow benchmarks. The following comparisons are also available to be viewed in the Conbench UI.

Language z-score threshold Number of microbenchmarks
Stable Improvements Regressions Total
C++ 5 2666 338 262 3266
Java 5 33 1 1 35

Because of the large number of benchmarks, the top 20 benchmark results that deviate most from the baseline in both the positive and negative directions are presented below. All microbenchmark results for this comparison can be explored interactively in the microbenchmark explorer.

Benchmark Params Analysis Results
z-score Percent Change Baseline result Contender result unit
arrow-bit-block-counter-benchmark
C++ 65536 −25.65 −297% 4,720,000,000 4,580,000,000 i/s1
C++ 32768 −35.11 −594% 4,702,000,000 4,423,000,000 i/s1
arrow-small-vector-benchmark
C++ <STATIC_VECTOR(int)> −271.40 −1,434% 546,200,000 467,900,000 i/s1
parquet-bloom-filter-benchmark
C++ <DoubleType> −40.18 −4,276% 441,400,000 252,600,000 i/s1
C++ <FloatType> −952.50 −4,233% 518,400,000 299,000,000 i/s1
C++ <Int32Type> −857.50 −4,714% 518,400,000 274,000,000 i/s1
C++ <Int64Type> −44.16 −4,679% 441,400,000 234,900,000 i/s1
C++ <Int96Type> −744.50 −3,799% 346,700,000 215,000,000 i/s1
C++ source=cpp-micro, suite=parquet-bloom-filter-benchmark −69.44 −1,003% 151,400,000 136,200,000 i/s1
C++ <FloatType> −46.65 −4,116% 329,000,000 193,600,000 i/s1
C++ <Int64Type> −518.10 −4,661% 322,000,000 171,900,000 i/s1
C++ <Int96Type> −467.00 −2,414% 258,600,000 196,200,000 i/s1
parquet-encoding-benchmark
C++ DecodeArrowNonNull_Dense/32768 −26.47 −1,277% 299 261 MB/s1
C++ DecodeArrow_Dense/32768 −28.26 −1,257% 299 261 MB/s1
C++ 1024 −37.98 −2,832% 6,719 4,816 MB/s1
C++ 1024 −30.78 −2,686% 6,239 4,563 MB/s1
C++ 32768/1 −64.18 −4,447% 336 186 MB/s1
C++ 32768/100 −69.69 −4,480% 328 181 MB/s1
C++ 32768/1000 −54.68 −4,099% 273 161 MB/s1
C++ 32768/5000 −27.64 −2,390% 232 176 MB/s1
1 MB/s = megabytes per second; ns = nanoseconds; i/s = iterations per second
Benchmark Params Analysis Results
z-score Percent Change Baseline result Contender result unit
arrow-acero-aggregate-benchmark
C++ 1048576/0 157.20 8,678% 25,800,000 48,180,000 i/s1
C++ 1048576/1 166.30 9,103% 26,270,000 50,180,000 i/s1
C++ 1048576/10 151.10 8,360% 25,140,000 46,150,000 i/s1
C++ 1048576/100 159.70 8,616% 25,560,000 47,580,000 i/s1
C++ 1048576/10000 167.20 8,668% 25,730,000 48,040,000 i/s1
C++ 1048576/2 177.80 7,357% 23,390,000 40,600,000 i/s1
C++ 1048576/0 111.30 8,094% 25,380,000 45,930,000 i/s1
C++ 1048576/1 110.50 8,219% 25,510,000 46,480,000 i/s1
C++ 1048576/10000 111.40 8,077% 25,340,000 45,810,000 i/s1
C++ 1048576/0 170.40 9,960% 26,590,000 53,070,000 i/s1
C++ 1048576/1 177.10 10,100% 26,740,000 53,730,000 i/s1
C++ 1048576/10 164.70 9,384% 25,760,000 49,940,000 i/s1
C++ 1048576/100 170.40 9,586% 26,320,000 51,550,000 i/s1
C++ 1048576/10000 185.80 10,160% 26,190,000 52,800,000 i/s1
C++ 1048576/2 177.40 8,055% 23,740,000 42,870,000 i/s1
arrow-compute-scalar-round-benchmark
C++ <RoundBinary, UInt32Type, RoundMode::HALF_TOWARDS_ZERO>/size:524288/inverse_null_proportion:0 186.20 5,926% 345 550 MB/s1
C++ <RoundBinary, UInt32Type, RoundMode::HALF_TO_ODD>/size:524288/inverse_null_proportion:0 172.40 5,353% 348 535 MB/s1
parquet-encoding-benchmark
C++ 1024 473.00 9,765% 669 1,323 MB/s1
C++ 4096 812.40 10,600% 684 1,408 MB/s1
C++ 4096 159.50 1,590% 348 404 MB/s1
1 MB/s = megabytes per second; ns = nanoseconds; i/s = iterations per second

z-score distribution

Plotting the distribution of zscores for all microbenchmark results will help identify any systematic differences between the baseline and contender. The shape of the distribution of z-scores provides a sense of the overall performance of the contender relative to the baseline. Narrow distirbutions centered around 0 indicate that the contender is performing similarly to the baseline. Wider distributions indicate that the contender is performing differently than the baseline with left skewing indicating regressions and right skewing indicating improvements.

Microbenchmark explorer

This microbenchmarks explorer allows you to filter the microbenchmark results by language, suite, and benchmark name and toggle regressions and improvements based on a threshold level of 5 z-scores. Languages, suite and benchmark name default to showing all results for that category. Additional benchmark parameters are displayed on the vertical axis resulting in each bar representing a case permutation. If a becnhmark does not have additional parameters, the full case permutation string is displayted. The display can be further filtered by selecting a specific language, suite, or benchmark name. Each bar can be clicked to open the Conbench UI page for that benchmark providing additional history and metadata for that case permutation.