2012-06-29 67 views
0

我有以下代碼:MEX代碼在MATLAB包裝

for i=1:N, 
    some_mex_file(); 
end 

我MEX文件執行下列操作:

  1. 聲明一個對象,我定義的類,具有2個大存儲器的塊,即32x2048x2類型的double。
  2. 處理此對象中的數據。
  3. 銷燬對象。

我在想,如果在爲對象分配大內存塊的循環中調用MEX文件時是否需要更多時間。我正在考慮遷移到C++,以便我只能聲明一次對象,並重置其內存空間,以便可以一次又一次地使用它,而無需新聲明。這是會有所作爲還是會變得毫無價值?換句話說,在MEX文件中分配內存需要更多時間而不是聲明一次並重用它?

+1

只是爲了清楚的事情,你的MEX函數聲明C++對象或MATLAB對象(在OOP意義上)? – Amro

+0

@Amro它聲明瞭C++對象。 – ubaabd

回答

1

因此,這裏通常的建議適用於:在Matlab中使用Profile和使用C/C++分析器,或者至少在調試器中多次停止它以查看它花費的時間。停止「想知道」它在哪裏花費時間,並且實際上測量花費時間。

但是,我遇到過這樣的問題,在MEX函數中分配/釋放內存是主要的性能下降。但是,您應該通過分析(或在調試器中停止代碼)驗證。

對這種性能問題的最簡單的辦法是雙重的:

  1. 移動循環到MEX功能。使用迭代計數調用MEX函數,並讓您的快速C/C++代碼實際執行循環。這消除了從Matlab調用到MEX函數的成本(對於大N來說可能相當大),並且便於第二次優化:

  2. 讓MEX函數緩存它的分配/釋放,這非常容易得多和更安全)做,如果你將循環移入MEX功能。這可以通過幾種方式完成,但最簡單的方法是隻分配一次空間(循環外),並在循環完成後釋放空間。