Sharing benchmark observations on decimal floating-point compression: comparing integer mapping with Gorilla/Chimp on time-series datasets #24935
Replies: 1 comment
|
Performance update: fastalp v0.1.37 release I have updated the benchmark observations with the latest fastalp v0.1.37 release (published on crates.io with source code at fastalp). Key improvements and updated metrics:
|
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Hello DataFusion community,
Apache DataFusion is widely used across modern analytical and time-series query engines. Since floating-point columns represent a major workload in columnar analytics, I wanted to share benchmark observations and implementation findings on lossless floating-point compression from fastalp (available on crates.io), an implementation of the Adaptive Lossless Floating-Point Compression (ALP) algorithm.
Benchmark results on real-world time-series datasets
I evaluated fastalp against classic floating-point codecs (Gorilla, Chimp, Chimp128, Patas) on public time-series datasets including city_temperature.csv, Stocks-Germany-sample.txt, and SSD_HDD_benchmarks.csv. Running 25 iterations per dataset on Apple Silicon (M2 Max) produced the following unified averages:
Overall throughput across standard IEEE 754 float benchmarks:
Implementation observations for columnar analytics
Decimal integer mapping: In real-world telemetry and business metrics, floating-point numbers often have a fixed or small number of decimal places (e.g. 19.99, 0.05). Mapping values to integers via adaptive decimal scaling (10^e) shifts the data domain to Frame-of-Reference (FOR) integer packing, enabling SIMD-accelerated execution rather than serial bitwise XOR streams.
Exact decimal division: Precomputed floating-point multiplication (value * 10^e) occasionally introduces 1-ULP precision noise due to IEEE 754 rounding (for example, 0.35 * 100.0 evaluates to 34.99999999999999, casting to 34 instead of 35). Adding an exact division path during sampling and reconstruction eliminates these pseudo-exceptions and preserves bit-packing efficiency.
First-order difference (Delta-ALP): For monotonic timestamps, cumulative metrics, and smooth waveforms, cascading first-order delta encoding onto the scaled integers significantly narrows residual values, improving compression ratios while preserving O(1) random block access.
Pure register SIMD decoding: Vectorized integer unpacking achieves 0.423 µs per 1000 values (~2.36 billion values/sec), reaching 55 to 77 GB/s linear memory bandwidth on modern CPUs.
Zero-heap streaming API: The compress_into and decompress_into interfaces allow encoding and decoding directly into caller-provided buffers, eliminating allocation overhead during query scans.
I hope these benchmark results and implementation findings provide useful reference points for columnar storage and query execution discussions.
All reactions