MATLAB代碼提速技巧之In-place Optimizations
function mainnx = rand(1e8, 1);nn% 普通函數, 輸入實參與輸出實參相同ntic;nx = notInplace(x);ntoc;n% 時間已過 0.254771 秒。nnn% 普通函數, 輸入實參與輸出實參不同ntic;ny = notInplace(x);ntoc;n% 時間已過 0.201775 秒。nnn% in-place函數, 輸入實參與輸出實參相同ntic;nx = inplace(x);ntoc;n% 時間已過 0.098609 秒。nnn% in-place函數, 輸入實參與輸出實參不同ntic;ny = inplace(x);ntoc;nendn% 時間已過 0.255816 秒。nnn% 普通函數的定義是輸入形參與輸出形參不同nfunction y = notInplace(x)ny = 1.2*x;nendnn% in-place函數的定義是輸入形參與輸出形參相同nfunction x = inplace(x)nx = 1.2*x;nendn
根據輸出形參與輸入形參是否相同, 輸出實參與輸入實參是否相同, 總共2*2=4個示例.
發現, 只有輸出形參與輸入形參相同, 並且輸出實參與輸入實參相同(第三個示例), 才能加速.
原理是, 其他三個情況下, 函數計算完以後, 必須將輸出變數拷貝出來, 而第三個示例不需要拷貝出來, 加速的部分其實就是節省下的拷貝時間.
當然, 這種優化只有在函數的計算時間很短, 同時數據量較大時, 才適用, 否則, 節省的拷貝時間佔比很小, 可以忽略不計.
有興趣的讀者可以自己動手驗證一下這句話, 比如將數據量從1e8, 改成1, 或者將運算從簡單的乘法運算改為比較複雜的正弦運算.
多謝 @MEZhang 的提醒,我感覺inplace優化需要加上第三個必要條件: 函數內部中輸入變數的維度(形狀)不發生變化。因為如果發生變化,就要建立新的變數代替原先的,這樣的話,退出函數時,還是得拷貝變數出去。
推薦閱讀:
※如何自學Matlab
※Matlab如何製作滑鼠精靈
※即將出版!《數學建模與數學實驗》書稿目錄
※Matlab|Matlab二維繪圖
※漫談Simulink:什麼是代數環?
TAG:MATLAB |