[轉載]MATLAB程式碼分析最佳化加速

來源:互聯網
上載者:User

標籤:

Profile(分析)
在加速你的matlab程式之前,你需要知道你的代碼哪一部分運行最慢。matlab提供個簡單的機制,讓你能夠知道你的代碼的某一部分運行所佔用CPU時間。通過在程式碼片段開始添加tic,及在結束添加toc;matlab就能計算出這一程式碼片段的已耗用時間。
Tic和toc方法存在兩個問題:
(1)顯示的時間是已耗用時間“wall clock”。這個時間受你在運行你的代碼時,你的電腦是否同時運行其它別的程式。
(2)你需要不斷地壓縮計時範圍來尋找你代碼運行最慢的位置。
一個最好的方法是利用matlab 內嵌的程式碼分析器。在你的程式前面通過添加命令profile on;及在程式結束添加profile viewer;並運行你的程式。當程式正常運行結束時,程式碼分析器視窗將彈出,並顯示分析結果。它包含的資訊有:
Function Name :函數名;
Calls :函數被調用次數;
Total Time :執行該函數的CPU總用時,包含任何其它被它調用的函數的CPU時間。
Self Time :執行該函數的CUP總用時,不包含任何其它被它調用的函數的CUP時間。
Total Time Plot :時間用時的曲線圖。
以上資訊可進行各種排序和詳細查看。
注意:當你完成你的程式碼分析後,請刪除profile on和profile viewer,因為內嵌程式碼分析器會使用的程式運行變慢。
標準提示
☆有問題找協助文檔。學會使用協助文檔,學會針對待解決的問題檢索文檔資料。
☆效能
查看MATLAB->Programming->Improving Performace and Memory Usage;或MATLAB->Programming Fundamentals->Performace->Techniques for Improveing Performace。
多線程
如果你使用的是多核心的電腦,那麼你就可以讓Matlab同時運行多個線程,Matlab程式中一些底層的函數(Low-level function)就有可能採用並行計算的方法。開啟多線程的方法:File->Preferences選擇General->Multithreading。扣選Enable multihread computation box。如果不限制使用核心的數目,可以保留使用Automatic。
注意:Matlab R2008a之前的版本在AMD處理器上是不支援多線程的。
向量化迴圈
Matlab的運算是針對向量(向量)和矩陣進行設計的,因此它在向量和矩陣上的運算速度比採用迴圈的方式更快。
例如:
index=0;
for time=0:0.001:60;
index=index+1;
waveForm(index)=cos(time);
end;
採用以下代碼可加快速度。
Time=0:0.01:60;
waveForm=cos(time);
一些有用的,可用於代替迴圈的函數:
any();size();find();cumsum();sum();
向量預分配
Matlab採用記憶體中一塊連續的空間來儲存向量和矩陣資料,而不是用鏈表。這就意味著你每給向量或矩陣增加一元素,Matlab需要尋找一塊足夠大的記憶體地區來儲存這個擴大後的向量或矩陣,然後複製現有的資料到新的記憶體地區。在迴圈中增加向量或矩陣元素的元數是允許的,但並不是明智之舉,而應該是一次性分配向量或矩陣的大小,或一次性重定義尺寸。
Results=0;
for index=2:1000;
results(index)=results(index-1)+index;
end
上述代碼將比以下代碼速度慢:
results=zeros(1,1000);
for index=2:1000;
results(kindex)=results(kindex-1)+index;
end;
注意:當你需要用zeros()來建立一個指定資料類型的向量或矩陣時,你可以使用建立參數來指定類型,而不是“重鑄”。results=int8(zeros(1,1000));將建立一個有1000個元素的double型零向量,然後把它轉換成int8類型。如果我們使用results=zeros(1,1000,’int8′); Matlab將支援建立1000個int8類型的向量,在建立可實現性及速度上將更具有優勢。
不要改變資料類型
Matlab為了能夠支援寬鬆的資料類型(例如一個變數能夠儲存不同類型的資料,而不是指定它為特定的資料類型),則Matlab除了儲存單純的資料之外,還需要伴隨資料存放區一定數量的頭資訊(header),這就意味著需要記憶體空間支儲存資料類型,同時意味需要在資料類型轉換上支付額外的電腦資源開支。
對於實資料使用 real…函數。
Matlab中的一些函數能夠同時適用於實類型資料和複類型資料。如果你只使用實資料,那麼採用特定的版本的,非複資料函數,那麼它啟動並執行速度將變得更快。這些函數如:reallog(), realpow(),realsqrt()。
使用“短路”邏輯操作
Matlab的“短路”邏輯操作可以在判斷條件達到充分條件後就停止計算處理,而不需要知道判斷所有條件。例如:if(index>=3)&&(data(index)==5); 當index小於3時,第二個條件判斷將不被處理,這樣就少了去判斷data(index)==5)的時間,提高速度。
使用函數指標
Matlab的一些函數使用函數名作用參數,常用一個變數支儲存這個函數名字串()如:func=’tan’;然後用這個變數作為函數的參數:fzero(func,0))。這種方法對於簡單的函數調用是很好的,但是對於在迴圈中的重複調用就存在兩個問題:
(1)在每一個迴圈中,Matlab需要去搜尋這個函數的路徑(如tan),這需要花費時間。
(2)在迴圈過程中,路徑可能會改變。這會保證在這一次迴圈中,某個版本的函數(如tan)被首先調用,而下一次迴圈中這個版本的函數又被首先調用,最終會造成結果不一致。
解決的辦法是使用檔案指標([email protected];或[email protected]),它能返回函數唯一的識別碼。調用方式同上。
檔案I/O
通常進階輸入輸出操作(load()和save())比一般的低級操作(fread()和fwrite())快。
☆記憶體使用量
關於記憶體的使用可查看協助文檔Using Menory Efficently。可查與Memory Usage相關的資訊。
一定記註:可以使用whos()來查看資料變數佔有用的記憶體空間大小。
複製數組
當你複製一個數組時,Matlab開始只複製一個指向資料的一個指標,僅當你隨後對任一版本進行修時,資料的複製才真正的執行。這種操作包括數組作為函數參數進行傳遞的情況-作為值傳遞的參數傳遞,而不是作為參考的傳遞。因此,你應該盡量避開對大數組進行小改動的操作。
資料不用時,釋放記憶體
如果一個變數以後已經不再使用,那麼你可以刪除它clear VariableName;則這個小塊的資料將可以重用。
注意:如果各變數在記憶體是連續的,則Matlab很容易重用這些大塊的記憶體,因此最好是先建立大的變數,後再建立小的變數,並且把它們組合起來。
結構體儲存
上文已經提到,在Matlab中的變數包含有描述資料類型的頭資訊。對於一個結構體,則有一個描述整個結構的頭資訊,及每個元素也分別有一個頭資訊。為了最小化地使用記憶體,我們應該小心地使用混合資料類型的數組和結構。
例如:
pixel.red(1:600,1:400)
pixel.grn(1:600,1:400)
pixel.blu(1:600,1:400)
則我們就需要儲存4個頭資訊。而:
pixel(1:600,1:400).red
pixel(1:600,1:400).grn
pixel(1:600,1:400).blu
我們就有720001個頭資訊。
使用最小的合適的資料類型
為了減小記憶體使用量量,對於特定的運算經常使用最小的資料類型。例如:
(1)對於虛部為零的資料,最好不要用complex去儲存。
(2)如果精度足夠,可採用single變數,而不用double。
(3)使用uint16來進行計數操作,它能儲存值為0到65535。但它比預設的double型省一半的記憶體。
使用疏鬆陣列
如果矩陣絕大多的資料為零值,可以把它轉化成稀疏形式(使用sparse()函數)。它將只儲存非零資料的數值和索引。因為需要額外的儲存資料的索引,因此只有二維資料的零值大約超過75%時,這種方法才是有效,否則稀疏形式反而需要更多的記憶體空間。
☆並行迴圈
如果從一個for迴圈的外部看,for迴圈滿足以下標準:
(1)迴圈的計數是整數;
(2)每次迴圈都是獨立的;
(3)計算迴圈先後順序無關。
那麼這個for迴圈就有可能可以替換成parfor迴圈(matlab2008a中可用最佳化算開啟並行通訊池:parfor迴圈包含於matlabpool open 和matlabpool close之間)。
注意:開啟一個並行工作池worker pool大約需要10-15秒鐘,關閉一個工作池大概需要5秒鐘。計算這個時間在內,這個方法對於迴圈時間超過30秒的情況才是值得的。

   

[轉載]MATLAB程式碼分析最佳化加速

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.