Function call takes a long time
Ältere Kommentare anzeigen
Hi all, I am writing a simulation code in MATLAB R2011b. I need it to run for at least 100,000 time steps, preferably more.
Here's the problem I am facing. I have a function call within my parent function. When I run the profiler, it shows that about 23.8% of the total time is spent CALLING the function. For one of my simulation models, the function gets called 715,903 times and the function call takes 174.432 seconds according to the profiler. The called function itself takes 195 seconds to run. My parent function takes 537 seconds.
This is what my function call looks like -
[C] = Decision(k,timeStep,MixedBuffer,c);
Is there any way I can reduce the 174.432 seconds (~3 minutes) which are taken by the function call? I hope I have been descriptive enough, but feel free to ask for more info.
Best, Sumant
Here's the relevant code -
function [C] = Decision(k,timeStep,MixedBuffer,c) %Returns serial number of chosen part.
global PartTable
global ActiveParts
global DemandArrivals
if(c==1) %For machine 1
I = zeros(1,5);
ChoiceMatrix = zeros(1,size(PartTable,2)); vertcat(ChoiceMatrix,PartTable(ActiveParts(serial,1),:));
ChoiceMatrix = vertcat(ChoiceMatrix,DemandArrivals);
ChoiceMatrix(1,:) = [];
if(isempty(ChoiceMatrix)==1)
C(1,1) = timeStep;
C(1,3) = 1;
else
[~,row] = min(ChoiceMatrix(:,1));
C = ChoiceMatrix(row,:);
C(1,3) = C(1,3)+1;
end
C;
else
I = zeros(1,5);
ChoiceMatrix = zeros(1,size(PartTable,2));
[serial,~] = find(ActiveParts(:,3)==k-1);
ChoiceMatrix = vertcat(ChoiceMatrix,PartTable(ActiveParts(serial,1),:));
k;
ChoiceMatrix(1,:) = [];
ActiveParts;
[~,row] = min(ChoiceMatrix(:,1));
C = ChoiceMatrix(row,:);
end
end
Akzeptierte Antwort
Weitere Antworten (4)
Walter Roberson
am 15 Dez. 2011
0 Stimmen
Do you modify any of those parameters within the function? If so there could be copying overhead.
Sumant Raykar
am 15 Dez. 2011
0 Stimmen
2 Kommentare
Jan
am 15 Dez. 2011
Please post the relevant part of the code.
Walter Roberson
am 15 Dez. 2011
Remove any "clear all" statement you have!
Fangjun Jiang
am 15 Dez. 2011
Pay attention to the warning message in M-editor. It gives you many hints on improvement. Some of them are minor. Others may have a big impact.
Two lines of I=zeros(1,5) are not needed because "I" is never used.
Input argument MixedBuffer is not used.
ChoiceMatrix = zeros(1,size(PartTable,2));
vertcat(ChoiceMatrix,PartTable(ActiveParts(serial,1),:));
ChoiceMatrix = vertcat(ChoiceMatrix,DemandArrivals);
ChoiceMatrix(1,:) = [];
In the above code, the first vertcat() has no returns. It's a waste of time. Why do you add an all-zeor row to the first row and then delete it. It's the same as ChoiceMatrix=DemandArrivals;
isempty(ChoiceMatrix)==1 is the same as isempty(ChoiceMatrix)
[serial,~] = find(ActiveParts(:,3)==k-1), no need to use the second return argument.
Another vertical concatenation and then removing.
The variable ChoiceMatrix seems unnecessary. Just use the global variable directly.
Don't use C and c as different variables. They are different but easily confused.
Sumant Raykar
am 15 Dez. 2011
0 Stimmen
3 Kommentare
Fangjun Jiang
am 15 Dez. 2011
It should not but it's hard to say definitely without having the complete data and code to run the profile. I would try to clean up the code as much as possible and then run the profile. You can always drill down to see which part takes the time, right?
Sumant Raykar
am 15 Dez. 2011
Fangjun Jiang
am 16 Dez. 2011
If that's something you want to save, you can put the code of your function inside your main function to avoid the function call.
Kategorien
Mehr zu Entering Commands finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!