in reply to Performance problem with Clone Method

This does the same thing as your Clone method but takes 1/3rd the time (for 10x10 matrices), just by not doing the completely redundant second map:

sub Clone2 { my $self = shift @_; my $matrix = $self->Matrix; return Matrix->new( "Matrix" => [ map{ [ @$_ ] } @$matrix ] ); }

If your matrices are very small (3x5 or 4x4 or less), then it might be worth breaking some OO taboos to gain a little more. This also does the same thing, but avoids a couple of method calls per invocation:

sub Clone3{ my $self = shift; bless { "Matrix" => [ map{ [ @$_ ] } @{ $self->{Matrix} } ] }, 'Matrix'; }

But in the end, if a call that takes 3 milliseconds (your original for a 100x100 matrix) takes 80% of your time, then you should really start questioning why it is necessary to Clone something 35 million times? It seems to me that using a better algorithm is likely to produce far greater savings.


Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^2: Performance problem with Clone Method
by Commandosupremo (Novice) on Jul 26, 2011 at 23:33 UTC

    I have implemented what you called Clone2 in place of my original clone and it does make a substantial difference.

    The matrices I am working with are very large, on the order of hundreds by hundreds

    As for changing algorithms, I wish I could but it is not an option, no other algorithm provides as simple of an implementation nor the ability to modify it as this one does. Just FYI, the algorithm I am working with is the Ullmann algorithm for finding maximum subgraph isomorphism.

    Lastly, I should point out that I believe I might have been wrong about the number of times the clone method is being called. According to smallprof the original clone method is called 35Million times but I don't believe this is accurate. After replacing clone with clone 2, which should be called the same number of times smallprof says it is being called 1.06 Million times. I know this is ancillary but curious nonetheless. I don't know if this is an error/limitation with smallprof but its worth pointing out nonetheless.

      I am working with is the Ullmann algorithm for finding maximum subgraph isomorphism

      I suspect that if you posted your implementation that its performance could be improved substantially. Especially if you are manipulating large 2D arrays of 0's & 1's much of the time.


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.