I recently wrote an article an SoA https://maikklein.github.io/post/soa-d/

But now I wanted to actually benchmark SoA vs AoS and it is so much harder than I thought.

In DMD SoA basically always beats AoS by a huge chuck. SoA is always at least twice as fast compared to AoS.

But with LDC it is just really hard to get reliable results.

I have created a example without any dependencies

http://dpaste.dzfl.pl/877a925e0a33

dub run -b release --compiler=dmd

benchmarking complete access
AoS: 419 ms, 938 μs, and 2 hnsecs
SoA: 11 μs and 8 hnsecs
benchmarking partial access
AoS: 521 ms, 381 μs, and 3 hnsecs
SoA: 5 μs


dub run -b release --compiler=ldc

benchmarking complete access
AoS: 1 μs and 6 hnsecs
SoA: 1 hnsec
benchmarking partial access
AoS: 1 hnsec
SoA: 1 hnsec


The problem I have is that LDC always seems to optimize the functions too much. At least one function executes always in "1 hnsec".

When I do manage do create an testcase where AoS and SoA have a reasonable time, then they are equally fast, no matter what I do.

What I wanted to see:

If I iterate over a collection and I always access all members, I would assume that AoS vs SoA should be equally fast.

If I iterate over a collection where the elements have a big size and I only access some members I would assume SoA to be much faster.

Any help tips are greatly appreciated.

Reply via email to