Fast matrix struct
John Colvin via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Dec 15 07:00:59 PST 2014
On Sunday, 14 December 2014 at 22:14:55 UTC, Ryan wrote:
> I'm writing a Matrix struct that I plan to use for some number
> crunching, which will be intensive at times. So I want it to be
> fast.
>
> Will I do better by manually managing the memory myself with
> malloc and free in the constructors/destructor or just using
> plain D arrays?
>
> The manual way I could bypass the GC and bounds checks. I don't
> need (or want) any of the fancy appending concatenation and the
> potential slowdowns from the heap allocations that comes with
> the builtin arrays.
>
> But I have to wonder, if I just don't use those features, will
> it be just as fast with the GC (assuming I compile out the
> bounds checks with the -release compiler option)?
>
> Right now my strategy is to malloc one large chunk of memory in
> the constructor (and postblit) and treat the 2-d matrix as a
> 1-d array internally. Then just use pointer arithmetic to
> access the elements.
>
> I know the best way to know is just to test. But writing both
> versions would take a LOT of work, and I'm looking for guidance
> about which path will probably be most fruitful.
>
> Thanks,
There should be no performance hit for using builtin array
indexing if you compile with -noboundscheck or the equivalent for
ldc/gdc.
The reverse situation is great though ("Huh, that looks garbled"
<recompile with bounds checks enabled, run and hit a RangeError>
"Oh look, that's where it went wrong").
Even if for some reason you do hit a problem (e.g. you only want
to disable bounds checks for one very hot loop) then adding a
quick .ptr before your array indexing will mean no check is
generated there under any circumstances.
Using D's builtin arrays (better referred to as slices) doesn't
imply any necessity to use the garbage collector. You can create
a slice from any memory you like, including malloc'd memory. Only
appending or manually increasing .length will cause the GC to get
involved. I would highly recommend them over raw pointers except
in very specialised circumstances.
std.container.Array is an option, but it historically hasn't been
perfect. I'm not sure of the current state of affairs.
More information about the Digitalmars-d-learn
mailing list