On 4/1/21 10:53 AM, ludo wrote:

The results are below (you can also git clone the repo + dub test):

| Concatenation method | benchmark in ms|
|---------------------|---------------------|
|with std:            | 385 ms|
|with stdReserve:     | 327 ms|
|with stdLength:      | 29 ms|
|with AppenderReserve:| 256 ms|
|with Arraybuilder:   | 118 ms|

- The use of reserve does not seem to improve much the standard concatenation performance. **Would you know why?**

My guess:

reserving cuts down on the reallocations, but that only takes some of the time. Appending a 1000-element int array is going to go from a 16-byte block, to a 32-byte block, etc. up to a 4096 byte block. This involves roughly 8 reallocations per test.

But every append requires an opaque function call into the runtime to check if the allocated length is big enough, and reallocate if necessary.

So if the reallocations aren't too expensive, then appending performance would not be too much different.

- AppenderReserve outperforms a basic concatenation, but the gain is not completely obvious, even with a call to reserve. **Is it expected behavior?**

Yes, because Appender has direct access to the allocated length, rather than having to go through an opaque call.


- ArrayBuilder is 3 times faster than standard concatenation, and twice as fast as AppenderReserve! **Which explanation would you give?**

This I have no idea on. There are probably a lot of explanations that could be true. Have you tried profiling the code?


There are some functions calls... Maybe the drag comes from there. I am really out of my league here, any help appreciated. I am not even sure which part of the Appender code is activated.

Are you compiling with -inline -O?

-Steve

Reply via email to