Skip to content

Instantly share code, notes, and snippets.

@dionisos2
Last active April 29, 2019 16:54
Show Gist options
  • Save dionisos2/a17feb744407fe95f0aa67d3081de65f to your computer and use it in GitHub Desktop.
Save dionisos2/a17feb744407fe95f0aa67d3081de65f to your computer and use it in GitHub Desktop.
using BenchmarkTools
macro fast_instance_iteration(_instance::Symbol)
local outer_instance = getfield(@__MODULE__, _instance)
local dispatch_on_instance = Val{outer_instance}
local base_type = typeof(outer_instance)
local field_values = [getfield(outer_instance, field) for field in fieldnames(base_type)]
local num_fields = length(field_values)
local id = rand()
local ex = Expr(:block)
ex.args = [
quote
Base.iterate(instance::$base_type) = iterate(instance, Val{instance}())
Base.iterate(instance::$base_type, don::$dispatch_on_instance) = iterate(instance, (Val{1}(), Val{$id}()))
end |> esc
]
for i in 1:num_fields
push!(ex.args,
quote
Base.iterate(instance::$base_type, ::Tuple{Val{$i}, Val{$id}}) = ($(field_values[i]), (Val{$(i+1)}(), Val{$id}()))
end |> esc
)
end
push!(ex.args, quote Base.iterate(instance::$base_type, ::Tuple{Val{$(num_fields+1)}, Val{$id}}) = nothing end |> esc)
return ex
end
macro fast_instance_iteration2(_instance::Symbol)
local outer_instance = getfield(@__MODULE__, _instance)
local dispatch_on_instance = typeof(Val(outer_instance))
local base_type = typeof(outer_instance)
local field_values = [getfield(outer_instance, field) for field in fieldnames(base_type)]
local num_fields = length(field_values)
quote
Base.iterate(instance::$base_type, idx=1) = iterate(Val(instance), idx)
Base.iterate(instance::$dispatch_on_instance, idx=1) = idx > $num_fields ? nothing : ($field_values[idx], idx+1)
end |> esc
end
struct M
a::Int
b::Int
c::Int
d::Int
e::Int
f::Int
g::Int
h::Int
i::Int
j::Int
k::Int
l::Int
end
m = M(10,20,30,40,50,60,70,80,90,100,110,120)
m2 = M(1:2:24...)
@fast_instance_iteration m
@fast_instance_iteration m2
for i in m
print(i, "/")
end
for i in m2
print(i, "/")
end
function test()
for i in m
end
for i in m2
end
end
@btime test()
@fast_instance_iteration2 m
@fast_instance_iteration2 m2
for i in m
print(i, "/")
end
for i in m2
print(i, "/")
end
@btime test()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment