why use string for this example of appender?
ludo
fakeaddress at gmail.com
Wed Mar 31 21:32:16 UTC 2021
Hi guys,
I am working on an old software in D1, which defines at some
point an array.d module. See my github file:
https://tinyurl.com/5ffbmfvz
If you go line 347, you see an ArrayBuilder struct, which is
supposed to behave exactly like an array but with faster
concatenation. The class comment says:
/**
* Behaves the same as built-in arrays, except about 6x faster
with concatenation at the expense of the base pointer
* being 4 system words instead of two (16 instead of 8 bytes on
a 32-bit system).
*/
I created a unittest, line 586, to test this statement. You can
git clone + dub test, to see the result. On my machine I get:
*** ArrayBuilder benchmark ***
1) Concatenation with std: 745 μs and 7 hnsecs
2) Concatenation with Arraybuilder: 236 μs and 8 hnsecs
3) Concatenation with Reserve: 583 μs and 5 hnsecs
4) Concatenation with Length: 611 μs and 8 hnsecs
5) Concatenation with Appender: 418 μs
In (1) I use standard array concatenation, in (2) I use the
ArrayBuilder struct, in (3) I test standard concat with a call to
reserve() before-hand, in (4) standard + length= beforehand, and
finally I dug out the Appender class in (5).
None of the D library tools beat the ArrayBuilder class! Note
though, that Appender is only two times slower, not 6x slower.
Can someone explain to me why ArrayBuilder is so fast (or the
others so slow)? What is this base pointer being "4 system words
instead of 2"? I read the code of ArrayBuilder, but I can not
spot any magic trick... Has this anything to do with standard
array concat being "safer" (thread-wise, bounds-wise, etc)?
And also, is there a std module which performs as well, some Fast
Appender class? Could not find any.
Thanks
More information about the Digitalmars-d-learn
mailing list