On Mon, 23 Nov 2009 16:33:42 -0500, dsimcha <dsim...@yahoo.com> wrote:
But one of my biggest gripes about the current appending implementation,
far more
important from a practical perspective than any theoretical safety
guarantees, is
that it doesn't scale to multiple threads. I've experienced this in a
real-world
program that I translated from someone else's C++ code that used
vector::push_back() quite liberally inside core algorithms. (The reason
is that
it was written more for simplicity/readability than performance, so the
person who
wrote it never thought to optimize this kind of stuff.) When I did a
literal
translation of this to D, everything was completely serialized. It
didn't even
scale to two cores. I had to rewrite significant portions of the code
in a way
that did not use appending to get it to scale at all.
D is supposed to be a language that is geared toward multi-threading. If
something as simple as array appending is a threading bottleneck (and it
was for
me in a real-world program), I don't care if it is O(1) because
effectively it has
a constant the size of Jupiter.
It's hard to say that your example is a good fit for the arrays of D.
What you need is a library type that does not require a global lock for
appending. Such is not the case for every example of appending in D, and
the existence of the current D arrays does not prevent you from adding
more specialized types. There are other costs to using such types besides
the global lock, such as storing the capacity, and if you are slicing,
locally storing the slice extents.
-Steve