diff --git a/src/misc/MiscellaneousBenchmarks.jl b/src/misc/MiscellaneousBenchmarks.jl index 1c2ea1fd..13755fc4 100644 --- a/src/misc/MiscellaneousBenchmarks.jl +++ b/src/misc/MiscellaneousBenchmarks.jl @@ -8,6 +8,53 @@ using Compat const SUITE = BenchmarkGroup() +########################################################################### +# isbits Union optimizations for type fields & array elements (issue #22441) + +g = addgroup!(SUITE, "isbitsunions", ["indexing", "simd", "union"]) + +mutable struct UnionField + u::Union{Int64, Nothing} +end + +function getsetfield(A) + for i = 1:length(A)-1 + A[i].u = A[i + 1].u + end +end + +function make_union_field_array(N) + A = [UnionField(i) for i in rand(Int64, N)] + for i in rand(1:N, div(N, 4)) + A[i].u = nothing + end + return A +end + +g["getsetfield"] = @benchmarkable getsetfield($(make_union_field_array(10000))) + +function getsetindex(A) + for i = 1:length(A)-1 + # v = A[i + 1] + # if v isa Nothing + # A[i] = v + # else + # A[i] = v + # end + A[i] = A[i + 1] + end +end + +function make_isbits_union_array(N) + A = Union{Int64, Nothing}[i for i in rand(Int64, N)] + for i in rand(1:N, div(N, 4)) + A[i] = nothing + end + return A +end + +g["getsetindex"] = @benchmarkable getsetindex($(make_isbits_union_array(10000))) + ########################################################################### # Splatting penalties (issue #13359)