標籤:

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 |