Huge overhead in fsolve due to fsolve>createExitMsg()

2 ビュー (過去 30 日間)
Naor Movshovitz
Naor Movshovitz 2017 年 10 月 4 日
コメント済み: Steve Grikschat 2019 年 3 月 8 日
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:
  1. Is anyone else seeing this behavior
  2. Is my replacement likely to break something in unexpected ways?
  3. 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.

採用された回答

Steve Grikschat
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
  • options.Display is set to 'off' or 'none' and
  • the output structure is not included in the list of outputs
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

その他の回答 (1 件)

Matt J
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
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!
Steve Grikschat
Steve Grikschat 2019 年 3 月 8 日
@Wade: see the update in the Answer below.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeSolver Outputs and Iterative Display についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by