Huge overhead in fsolve due to fsolve>createExitMsg()
Afficher commentaires plus anciens
Is it just me or is the fancy exit messaging in fsolve creating huge overhead?I imagine this might impact other optim toolbox functions but I have only tested with fsolve so far. The profiler shows approx. 35% of the fsolve run time spent in a call to fsolve>createExitMsg. Replacing the two relevant lines with something like the below resulted in about 30% overall speedup in my problem (calling fsolve many times in a loop):
if EXITFLAG > 0 % if we think we converged:
% Call createExitMsg with appended additional information on the closeness
% to a root.
if Resnorm > sqrtTolFunValue
msgData = internalFlagForExitMessage(algorithmflag == 2,msgData,EXITFLAG);
EXITFLAG = -2;
end
%OUTPUT.message = createExitMsg(msgData{:},Resnorm,optionFeedback.TolFunValue,sqrtTolFunValue);
OUTPUT.message = msgData;
else
%OUTPUT.message = createExitMsg(msgData{:});
OUTPUT.message = msgData;
end
In the above I commented out the offending calls and replaced with just saving the msgData cell.
Questions:
- Is anyone else seeing this behavior
- Is my replacement likely to break something in unexpected ways?
- Since we're talking optimization, the optimget function is another overhead hog, taking about 10% of the remaining run time! But maybe I'll start a separate thread for that one.
Réponse acceptée
Plus de réponses (1)
You must have a really small problem size for createExitMsg to make such a large percentage contribution. In something like the following, for example, I see negligible contribution from createExitMsg in the profiler (R2017a)
opts1=optimoptions(@fsolve,'algorithm','levenberg-marquardt');
n=200; A=rand(n); x0=rand(n,1);
tic; fsolve(@(x) norm(A*x)^2, x0,opts1); toc;
It is interesting, though, that the exit message is always created, even when the 'Display' option is set to 'none' and the 4th output argument is not requested.
4 commentaires
Naor Movshovitz
le 5 Oct 2017
Steve Grikschat
le 9 Oct 2017
Hi Naor,
Thanks for reporting this. We're taking a look at fixing it systematically now.
Your change shouldn't break anything unless you want the "message" field of the "output" structure from the solver. My guess is that you don't need it, so you should be ok.
About optimget, we're also looking at that as well. If you are not passing any options to fsolve, one possible speedup is to create a default* options set 1x and pass it each time.
- You can use either
options = optimoptions('fsolve');
% or
options = optimset('fsolve');
Wade Hilts
le 8 Mar 2019
Any progress on this update? It's even worse for using quadprog() because it calls the getExitMsg.p file which cannot be edited :(
Very inefficient code!
Steve Grikschat
le 8 Mar 2019
@Wade: see the update in the Answer below.
Catégories
En savoir plus sur Solver Outputs and Iterative Display dans Centre d'aide et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!