Optimize my code =)

Nick Sabalausky SeeWebsiteToContactMe at semitwist.com
Fri Feb 14 14:18:58 PST 2014


On 2/14/2014 11:00 AM, Robin wrote:
>
> class Matrix(T = double) {
>      private T[] data;
>      private Dimension dim;
> }
>

A matrix is just plain-old-data, so use a struct, you don't need a class.

A struct will be much more lightweight: A struct doesn't normally 
involve memory allocations like a class does, and you'll get better data 
locality and less indirection, even compared to a final class.

>
> I am using opIndex and opIndexAssign in order to access and assign the
> matrix values:
>
> T opIndex(size_t row, size_t col) const {
>      immutable size_t i = this.dim.offset(row, col);
>      if (i >= this.dim.size) {
>          // TODO - have to learn exception handling in D first. :P
>      }
>      return this.data[i];
> }

No need for the bounds check. D already does bounds checks automatically 
(unless you compile with -noboundscheck, but the whole *point* of that 
flag is to disable bounds checks.)

But that said, I don't know whether the compiler might already be 
optimizing out your bounds check anyway. So try it and profile, see what 
happens.

>
> Another nice thing to know would be if it is possible to initialize an
> array before it is default initialized with T.init where T is the type
> of the array's fields. In C++ e.g. there is no default initialization
> which is nice if you have to initialize every single field anyway. E.g.
> in a Matrix.random() method which creates a matrix with random values.
> There it is unnecessary that the (sometimes huge) array is completely
> initialized with the type's init value.

You can opt-out of the default initialization with a void initializer: 
http://dlang.org/declaration.html#VoidInitializer

Although to be honest I forget how to do that for arrays, and the 
functions other people already suggested for creating/initing your array 
probably already do that anyway.



More information about the Digitalmars-d-learn mailing list