2017-09-10 63 views
1

我正在運行調用lsqnonlin()1000次的代碼。我剖析了代碼,發現optimoptions()佔用了大約40%的時間。相反,我設置了opt1 = optimotpions()一次,並將opt1作爲參數傳遞給運行lsqnonlin()的函數,我看到了性能改進。Matlab分析器:optimoptions()與lsqnonlin()大致相同時間

什麼是採取optimoptions()那麼長?

回答

0

好吧,讓我們來看看什麼optimoptions內部函數的作用:

open optimoptions 

這似乎是功能的核心部分是由以下行表示:

options = optim.options.createSolverOptions(solverName, varargin{:}); 

讓我們看看createSolverOptions的功能吧:

open optim.options.createSolverOptions 

賓果!在代碼中的註釋表明爲什麼optimoptions,如果一個循環內多次調用,可能對整體性能有很大的影響的原因:

我們檢查,看看是否有全局優化工具箱的安裝位置。此外,我們假設這些工具箱文件在調用此函數之間不會被刪除。

請注意,我們在此處不執行許可證檢查以查看用戶是否可以創建一組全局優化工具箱選項。爲確保許可證檢查的正確性,每次調用此函數時都必須檢查許可證。如果在嚴密的循環中多次調用optimoptions,這將非常昂貴。

因此,我們依賴許可證管理器在用戶安裝了全局優化工具箱但沒有可用許可證的情況下拋出錯誤。

通過代碼中包含的許可證檢查,選項對象創建過程大幅度減慢。最重要的是,optimoptions函數及其子函數包含很多try-catch塊,regexfor loops中的提取和轉換,以及其他不太好的代碼。