One specific line of a function is taking too long

4 次查看(过去 30 天)
I am having issues with a particular function. Also, it is a very simple one, with very quick calculations in it. It serves to assemble the stiffness matrix in a Finite Element Analysis. All it does is: takes a 3x3 matrix out of a bigger one and adds an already-calculated 3x3 to it. I started noticing strange calculation times, so I tried different ways to compute that, but the results are always the same. I'm posting the results of the Profiler run on the 3 different versions of this particular function. The weird thing is that Matlab always takes a huge amount of time to run the 1st row of the program, while going fairly quick with the others.
Version 1:
Version 2:
Version 3:
Has anybody got a clue about what's taking it so long?
Thanks.
  7 个评论
per isakson
per isakson 2014-3-1
编辑:per isakson 2014-3-1
Why only the first line?
With R2013a this code
val = randn( 1e4 );
tic, val( 111,113 ) = val( 1111, 1133 ); toc
returns
Elapsed time is 0.000004 seconds.
(The Task Manager does not show allocating of memory.)
Alessandro
Alessandro 2014-3-1
编辑:Alessandro 2014-3-1
That's what I am trying to find out. Apparently the problem is the fact that an input variable changes during the call. I will investigate this tomorrow. Anyways I'm using 2013a as well.

请先登录,再进行评论。

回答(2 个)

per isakson
per isakson 2014-3-1
编辑:per isakson 2014-3-4
This experiment on R2013a 64bit, Win7 and 8GB suggests
  • try make K global
  • a copy of val is created by cssm_passing_by_value(val) (and Task Manager confirms)
  • however, it does not explain your 25s(?)
>> global val
>> val = randn( 1e4 );
>> cssm_global() ;
Elapsed time is 0.000007 seconds. <<<<<<<<<<<<<<<<<
Elapsed time is 0.000001 seconds.
>> val = cssm_passing_by_value( val ) ;
Elapsed time is 0.506452 seconds. <<<<<<<<<<<<<<<<<<
Elapsed time is 0.000003 seconds.
>>
where
function cssm_global()
global val
tic, val( 111,113 ) = val( 1111, 1133 ); toc
tic, val( 119,119 ) = val( 5111, 5133 ); toc
end
and where
function val = cssm_passing_by_value( val )
tic, val( 111,113 ) = val( 1111, 1133 ); toc
tic, val( 119,119 ) = val( 5111, 5133 ); toc
end
.
Surprising result with passing "by value"
I've made another few confusing experiments. (I don't think confusing, because of mistakes on my part, but [...].) Here is one such result:
  • the long execution time disappears when I successively pass the array to sub-functions and change an element at each level - unbelievable
>> val = randn( 1e4 );
>> val = cssm_passing( val );
Elapsed time is 0.000004 seconds. <<<<<<<<<<<<<<<<
Elapsed time is 0.000001 seconds.
where ( I've renamed the old m-file se above.)
function val = cssm_passing ( val )
val(1,1) = 1;
val = sub_passing( val );
end
function val = sub_passing( val )
val(2,2) = 2;
val = sub2_passing( val );
end
function val = sub2_passing( val )
tic, val( 111,113 ) = val( 1111, 1133 ); toc
tic, val( 119,119 ) = val( 5111, 5133 ); toc
end
I've tested with these three functions in one m-file and in three, respectively. The result was the same in both cases.
  7 个评论
per isakson
per isakson 2014-3-2
编辑:per isakson 2014-3-2
  • That's five and an half hour. Something is terribly wrong.
  • Did you try feature('accel','on/off')?
  • Did you try to "pass" K as global?
  • Send the problem to the tech support. Do you have a license that allows that?
Alessandro
Alessandro 2014-3-2
This last result is obtained by the same model I had before. I can't access my PC on weekends, I just have it run and sendmail when it finishes running the script. Anyways that runtime is outrageous. Hope they are going to give me a good explanation for that!

请先登录,再进行评论。


Alessandro
Alessandro 2014-3-3
New informations about the issue:
  • Making K global doesn't change anything. Still same runtime.
  • By-passing the function and pasting those 4 lines inside the main code, of course, solves the issue, but I honestly do not like to do that. Especially since I do not understand the reason why the error shows up.
This is the new runtime for those particular 4 lines of code (same as the "Version 1" in my original post):
0.02 compared to the previous 29 seconds is a 145000% difference. :D
  4 个评论
per isakson
per isakson 2014-3-4
编辑:per isakson 2014-3-4
  • You write "Making K global doesn't change anything. Still same runtime." That is not consistent with my result.
  • I've added the result of another experiment to my answer. See above.
Alessandro
Alessandro 2014-3-5
In my script, passing K to the function as global, did not change runtime. Still have no clue about this. Although your experiment proves it may speed things up. Also, it is very interesting that you noticed the long runtime disappears while using sub-functions!

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Multicore Processor Targets 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by