Ah! [Foreheadslapping] For some reason I thought it didn't matter in this case, but of course it does.
So, is this less of a problem with NTuple as array then, than with Tuple, because the length is known? On Tuesday, April 12, 2016 at 3:06:09 PM UTC+2, Yichao Yu wrote: > > On Tue, Apr 12, 2016 at 5:43 AM, DNF <[email protected] <javascript:>> > wrote: > > Wow! That is a huge difference. > > > > I suspected that my benchmark was flawed, but I don't understand in what > > way, since is doesn't seem like anything is being inappropriately > optimized > > away. Quite the contrary, my benchmark is running slowly with lots of > > allocations. > > > > The question remains, though, when is Vector better/faster in cases when > > both vectors and tuples are possible to use? Are arrays always this slow > > compared to tuples? > > > > As for what's holding me back from using FixedSizeArray: nothing but > pure > > ignorance! > > > > > > On Tuesday, April 12, 2016 at 11:06:25 AM UTC+2, Simon Danisch wrote: > >> > >> Your benchmark is flawed. > >> Try something like the Benchmarks package, or use this: > >> > >> using FixedSizeArrays > >> Base.(:+){T}(p1::NTuple{2,T}, p2::NTuple{2,T}) = (p1[1]+p2[1], > >> p1[2]+p2[2]) > >> function test(a, b, N) > >> ct = a+b > >> for _ in 1:N ct = ct+a+b end # use intermediate result so that > llvm > >> doesn't just remove the loop > >> ct # return value so it doesn't get optimized away > >> end > >> a, b = randn(2), randn(2) > >> at, bt = (randn(2)...), (randn(2)...) > >> p1, p2 = Point2D(randn(2)...), Point2D(randn(2)...) > > ^^^ These are not type stable even in a function due to the splatting. > The compiler has to know the size of the array to know the type of the > tuple. This is the main issue with using tuple as array, you easily > get dynamic dispatch or a crazy amount of codegen without realizing > it. > > >> > >> #warm up > >> test(a,b,10^7) > >> test(at,bt,10^7) > >> test(p1,p1,10^7) > >> > >> > >> @time test(a,b,10^7) # 1.175718 seconds (40.00 M allocations: 1.788 GB, > >> 9.77% gc time) > >> @time test(at,bt,10^7) #0.017781 seconds (6 allocations: 208 bytes) > >> @time test(p1,p1,10^7) #0.017783 seconds (6 allocations: 208 bytes) > >> > >> > >> As you can see, tuples and types are pretty much the same, while Vector > is > >> far behind. > >> In this benchmark, it's mainly because the Vector is heap allocated. > >> Tuples are preferable to types, since they have the same performance, > but > >> you can implement n-dimensional point types. > >> If you already found FixedSizeArrays, what's holding you back of using > it? > >> It already has the Point{N, T} type and GeometryTypes.jl has even more > ;) > >> > >> Best, > >> Simon > >> Am Montag, 11. April 2016 22:00:59 UTC+2 schrieb Anonymous: > >>> > >>> If I have a vector of data which I don't intend to ever change, should > I > >>> represent it as a tuple rather than a 1d array? Is there any benefit > above > >>> and beyond protecting against mutability? Is it more efficient? >
