# Struct of singleton Abstract types performance

**URL:** <https://discourse.julialang.org/t/struct-of-singleton-abstract-types-performance/77679>\
**Category:** Performance\
**Tags:** struct\
**Created:** [March 10, 2022, 11:39am UTC](https://discourse.julialang.org/t/struct-of-singleton-abstract-types-performance/77679 "2022-03-10T11:39:28Z")\
**Posts on this page:** 1\
**Showing post:** 4

<div class="post-metadata">

**Author:** ![goerch](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/goerch/32/29122_2.png) [@goerch](https://discourse.julialang.org/u/goerch)\
**Post date:** [March 10, 2022, 12:30pm UTC](https://discourse.julialang.org/t/struct-of-singleton-abstract-types-performance/77679/4 "2022-03-10T12:30:13Z")

</div>

Next trial;)

```julia
using BenchmarkTools

abstract type AbstractType end

struct ConcreteSingleton1 <: AbstractType end
struct ConcreteSingleton2 <: AbstractType end
struct ConcreteSingleton3 <: AbstractType end

mutable struct MyStruct1
    x :: Int
    consin :: AbstractType
end

mutable struct MyStruct2
    x :: Int
    consin :: Type
end

mutable struct MyStruct3
    x :: Int
    consin :: ConcreteSingleton1
end

#sum ints
function f(vs)
    vsum = 0
    for v in vs
        if v.consin isa ConcreteSingleton1
            cs1 = v.consin
            vsum += v.x + fs(cs1)
        elseif v.consin isa ConcreteSingleton2
            cs2 = v.consin
            vsum += v.x + fs(cs2)
        elseif v.consin isa ConcreteSingleton3
            cs3 = v.consin
            vsum += v.x + fs(cs3)
        else 
            @assert false
        end
    end
    return vsum
end
function f(vs::Vector{MyStruct2}) 
    vsum = 0
    for v in vs
        if v.consin isa Type{ConcreteSingleton1}
            vsum += v.x + fs(ConcreteSingleton1)
        elseif v.consin isa Type{ConcreteSingleton2}
            vsum += v.x + fs(ConcreteSingleton2)
        elseif v.consin isa Type{ConcreteSingleton3}
            vsum += v.x + fs(ConcreteSingleton3)
        else 
            @assert false
        end
    end
    return vsum
end

fs(a) = 0
fs(cs1::ConcreteSingleton1) = 1
fs(cs1::ConcreteSingleton2) = 2
fs(cs1::ConcreteSingleton3) = 3

fs(cs1::Type{ConcreteSingleton1}) = 1
fs(cs1::Type{ConcreteSingleton2}) = 2
fs(cs1::Type{ConcreteSingleton3}) = 3

mystructs1 = fill(MyStruct1(1, ConcreteSingleton1()), 1000);
mystructs2 = fill(MyStruct2(1, ConcreteSingleton1), 1000);
mystructs3 = fill(MyStruct3(1, ConcreteSingleton1()), 1000);

@btime f(mystructs1)
@btime f(mystructs2)
@btime f(mystructs3)

```

yielding

```julia
  45.100 μs (745 allocations: 11.64 KiB)
  984.615 ns (1 allocation: 16 bytes)
  521.466 ns (1 allocation: 16 bytes)

```

Inspired by [this](https://discourse.julialang.org/t/ann-valsplit-jl-compile-away-dynamic-dispatch-on-val-typed-arguments/77096/3) announcement, still not sure if this helps…

Edit: fixing significant mistakes…

---

_[View the full topic](https://discourse.julialang.org/t/struct-of-singleton-abstract-types-performance/77679)._
