Skip to content

Conversation

@happygiraffe
Copy link
Collaborator

In Go 1.17 and Go 1.20, new functions were added to create slices which significantly simplify the "reinterpret []byte" functions.

This should be a pure-refactoring. All tests pass.

This was surfaced while looking at an msan issue inside Google (b/461253460).

Benchmarks

I ran go test -bench='.*serial.*' -run=^$ before and after this change.
There appears to be no change in performance.

% benchstat /tmp/before /tmp/after
goos: darwin
goarch: arm64
pkg: github.com/RoaringBitmap/roaring/v2
cpu: Apple M1 Pro
                                            │ /tmp/before  │              /tmp/after              │
                                            │    sec/op    │    sec/op     vs base                │
UnserializeReadFrom/ReadFrom-650-10           323.3n ± ∞ ¹   322.3n ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeReadFrom/ReadFrom-6500-10          1.201µ ± ∞ ¹   1.188µ ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeReadFrom/ReadFrom-65000-10         1.182µ ± ∞ ¹   1.191µ ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeReadFrom/ReadFrom-650000-10        1.577µ ± ∞ ¹   1.653µ ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeReadFrom/ReadFrom-6500000-10       5.533µ ± ∞ ¹   5.562µ ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeFromBuffer/FromBuffer-650-10       74.28n ± ∞ ¹   72.88n ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeFromBuffer/FromBuffer-6500-10      77.76n ± ∞ ¹   70.13n ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeFromBuffer/FromBuffer-65000-10     75.16n ± ∞ ¹   69.88n ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeFromBuffer/FromBuffer-650000-10    335.5n ± ∞ ¹   310.8n ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeFromBuffer/FromBuffer-6500000-10   2.547µ ± ∞ ¹   2.409µ ± ∞ ¹       ~ (p=1.000 n=1) ²
geomean                                       521.4n         507.0n        -2.77%
¹ need >= 6 samples for confidence interval at level 0.95
² need >= 4 samples to detect a difference at alpha level 0.05

                                            │  /tmp/before  │              /tmp/after               │
                                            │     B/op      │     B/op       vs base                │
UnserializeReadFrom/ReadFrom-650-10           1.473Ki ± ∞ ¹   1.473Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeReadFrom/ReadFrom-6500-10          8.109Ki ± ∞ ¹   8.109Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeReadFrom/ReadFrom-65000-10         8.109Ki ± ∞ ¹   8.109Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeReadFrom/ReadFrom-650000-10        8.613Ki ± ∞ ¹   8.613Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeReadFrom/ReadFrom-6500000-10       13.68Ki ± ∞ ¹   13.68Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeFromBuffer/FromBuffer-650-10         44.00 ± ∞ ¹     44.00 ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeFromBuffer/FromBuffer-6500-10        52.00 ± ∞ ¹     52.00 ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeFromBuffer/FromBuffer-65000-10       52.00 ± ∞ ¹     52.00 ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeFromBuffer/FromBuffer-650000-10      448.0 ± ∞ ¹     448.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeFromBuffer/FromBuffer-6500000-10   4.415Ki ± ∞ ¹   4.415Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
geomean                                       1.093Ki         1.093Ki        +0.00%
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal

                                            │ /tmp/before │             /tmp/after              │
                                            │  allocs/op  │  allocs/op   vs base                │
UnserializeReadFrom/ReadFrom-650-10           8.000 ± ∞ ¹   8.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeReadFrom/ReadFrom-6500-10          8.000 ± ∞ ¹   8.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeReadFrom/ReadFrom-65000-10         8.000 ± ∞ ¹   8.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeReadFrom/ReadFrom-650000-10        27.00 ± ∞ ¹   27.00 ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeReadFrom/ReadFrom-6500000-10       207.0 ± ∞ ¹   207.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeFromBuffer/FromBuffer-650-10       4.000 ± ∞ ¹   4.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeFromBuffer/FromBuffer-6500-10      4.000 ± ∞ ¹   4.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeFromBuffer/FromBuffer-65000-10     4.000 ± ∞ ¹   4.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeFromBuffer/FromBuffer-650000-10    13.00 ± ∞ ¹   13.00 ± ∞ ¹       ~ (p=1.000 n=1) ²
UnserializeFromBuffer/FromBuffer-6500000-10   103.0 ± ∞ ¹   103.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
geomean                                       13.77         13.77        +0.00%
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal

In [Go 1.17](https://go.dev/doc/go1.17#language) and
[Go 1.20](https://go.dev/doc/go1.20#language),
new functions were added to create slices which significantly simplify
the "reinterpret []byte" functions.
@lemire
Copy link
Member

lemire commented Nov 24, 2025

Looks like a no brainer. I'll hunt for someone to review this because I am not familiar with these new functions. (I trust you, but I don't trust myself.)

@clausecker
Copy link

Looks good to me.

@lemire
Copy link
Member

lemire commented Nov 24, 2025

Merging based on @clausecker's review.

@lemire lemire merged commit 2d93a7e into RoaringBitmap:master Nov 24, 2025
8 checks passed
@lemire
Copy link
Member

lemire commented Nov 24, 2025

Will be part of the next release.

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.

3 participants