- options.Display is set to 'off' or 'none' and
- the output structure is not included in the list of outputs
Huge overhead in fsolve due to fsolve>createExitMsg()
2 次查看(过去 30 天)
显示 更早的评论
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.
0 个评论
采纳的回答
Steve Grikschat
2019-3-8
An update:
This was changed in all solvers in R2018a. Now, the message is not made if it is not requested, i.e. if
The changes above improve performance on small, fast-to-solve problems.
Additionally, if no options are given, the calls to optimget are essentially bypassed. This also improves performance in cases like the above.
Here is some timing data I got from running R2018b on my machine:
opts = optimoptions(@fsolve);
n=10; A=rand(n); b = rand(n,1); x0=rand(n,1);
% Run once for JIT effect
fsolve(@(x) A*x - b, x0,opts);
% Time baseline - with options and display on
tic
for k = 1:20
fsolve(@(x) A*x - b, x0,opts);
end
tBase = toc;
opts.Display = 'none';
tic
for k = 1:20
fsolve(@(x) A*x - b, x0,opts);
end
tNoDisplay = toc;
tic
for k = 1:20
fsolve(@(x) A*x - b, x0);
end
tNoOpts = toc;
tBase, tNoDisplay, tNoOpts
With output
tBase =
0.0926
tNoDisplay =
0.0578
tNoOpts =
0.0770
0 个评论
更多回答(1 个)
Matt J
2017-10-4
编辑:Matt J
2017-10-5
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 个评论
Wade Hilts
2019-3-8
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!
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!