Optimize my code =)

Nick Sabalausky SeeWebsiteToContactMe at semitwist.com
Sat Feb 15 22:19:29 PST 2014


On 2/15/2014 6:06 PM, Robin wrote:
>
> Matrix is still a class but I changed it to a final class preventing
> matrix methods to be virtual. Dimension is now a final struct (don't
> know if 'final' is affecting structs in any way tough ...). This mainly
> gave the multiplication a huge performance boost.
>

Like in other languages, "final" means "cannot inherit from this". Since 
structs, by definition, don't support inheritance anyway, "final" isn't 
really applicable - they're inherently "final" no matter what.

> When converting the Matrix to a struct from class the multiplication
> even lowered from ~4.3 seconds to about 3.6 seconds. However, I am
> currently not sure if I want matrices to be structs (value types).
>

They really should be structs. There's basically no benefit to making 
them classes. Classes are for when you need inheritance and don't need 
performance. Java, from what I understand, does a reasonable job 
compensating for the inherent inefficiency of classes by going to great 
lengths to have absolute top-of-the-line class-oriented optimizations 
and GC and strip out all the class underpinnings when possible (AIUI). 
But D is much more like C# with "class vs struct" being an explicit thing.

Keep in mind too, the data inside dynamic arrays is already by 
reference. Arrays in D are basically like this:

struct Array(T)
{
     size_t length;
     T* ptr;
}

So even when your matrix is a struct, the actual values inside the 
matrix are still by reference (because it's through that pointer). So 
you're still not actually copying the data inside the matrix as you pass 
it around. You're only copying the dimension, length and pointer. And 
those are copied via a straight memcopy, not a "one field at a time" as 
I've heard C++ does (though I could be wrong, it's been forever since I 
did much C++).

And if you need to pass a struct by reference, there's always still 
"ref". Class really just isn't the right thing for a matrix, especially 
if you're paying attention to performance.


> I have also tried the LDC compiler. However, it gave me some strange
> bugs. E.g. it didn't like the following line:
>
> ref Matrix transpose() const {
>      return new Matrix(this).transposeAssign();
> }
>

Doing that without parens around the "new Matrix(this)" is a very new 
feature, so I'm not entirely surprised LDC doesn't have it yet. Like 
Stanislav said, you can just add parens for now.




More information about the Digitalmars-d-learn mailing list