Playing with Entity System, performance and D.
ag0aep6g via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Jun 19 12:06:57 PDT 2017
On 06/19/2017 07:42 PM, SrMordred wrote:
> I was playing around my ES and different ways of doing it with D.
>
> I end up with a performance test of alias func vs ranges vs opApply.
>
> code here:
> https://dpaste.dzfl.pl/a2eff240552f
>
> Results on my machine win 10 x64, compiling with:
> dub run --build=release --arch=x86 --compiler=ldc2
> (unable to test with gdc because
> https://forum.dlang.org/thread/bfmbvxtnqfhhgquayrro@forum.dlang.org)
>
> Alias func: ~40ms
> Range Type(front, popFront, emtpy): ~50ms
> OpApply: ~25ms
>
> So first, if I make some really dumb relate to profiling speed or any D
> code let me know!
>
> 1) I thought that ranges were the fastest, but it got the least
> performant code.
I don't think ranges are expected to be faster than the others.
> 2) opApply was faster than alias func. Its suprising for me.
For me, alias_fun and op_apply are very close. If anything, alias_fun
seems to be slightly faster.
Typical output (ldc2 -release -O3):
----
36
Result(51)
44
Result(88)
37
Result(-127)
----
> 3) Not possible to return multiple values. So in the front() method I
> Wrapped a node of pointers.(maybe a performance impact here?, there is a
> better way of doing it? )
Avoiding bounds checking makes it faster for me (but is unsafe of course):
----
return Node(&values.ptr[index_[0]], &results.ptr[index_[1]]);
----
Typical timing:
----
37
Result(74)
39
Result(113)
38
Result(-1)
----
Almost there, but still a bit slower than the others.
By the way, if I read it right, indexes is just `0 .. limit`, twice,
isn't it? So there's no real point to it in the sample code. When I get
rid of indexes and just count up to `limit`, all three versions perform
the same. But I guess you're going to have arbitrary values in indexes
when you actually use it.
> 4) there are no equivalent of declaring Type& x; (ref type) right?
Right. ref is only for parameters and returns. For variables, you have
to user pointers.
More information about the Digitalmars-d-learn
mailing list