2011-07-14 31 views
2

爲什麼索引到數據集數組這麼慢?進入dataset.subsref函數的峯值顯示數據集的所有列都存儲在單元格數組中。然而,單元索引比數據集索引要快得多,它只是索引到引擎蓋下的單元陣列中。我的猜測是,這與MATLAB OOP的一些開銷有關。任何想法如何加快這一點?統計信息工具箱的數據集數組索引非常慢

%% Using R2011a, PCWIN64 
feature accel off; % turn off JIT 

dat = (1:1e6)'; 
dat2 = repmat({'abc'}, 1e6, 1); 
celldat = {dat dat2}; 
ds = dataset(dat, dat2); 
N = 1e2; 

tic; 
for j = 1:N 
    tmp = celldat{2}; 
end 
toc; 

tic; 
for j = 1:N 
    tmp2 = ds.dat2; % 2.778sec spent on line 262 of dataset.subsref 
end 
toc; 

feature accel on; % turn JIT back on 
Elapsed time is 0.000165 seconds. 
Elapsed time is 2.778995 seconds. 

編輯:我已經更新的例子更喜歡我所看到的問題。在dataset.subsref - 「b = a.data {varIndex};」的第262行花費了大量時間。這對我來說很奇怪,因爲它是一個簡單的細胞去引用。我想知道是否有一個OOP技巧可以讓我在沒有奇怪開銷的情況下索引「a.data」。

編輯2:根據安德魯的建議,我已經將此作爲一個錯誤提交給MatWorks。如果我從他們那裏聽到任何信息,將更新

EDIT3: Matlab的迴應,並表示,他們意識到了這個問題現在將修復它在未來的版本。他們指出,這個問題是針對單元陣列的,如果可能的話儘量避免它們。

+1

它在MATLAB profiler下看起來像什麼? –

+0

+1 Richie的評論是任何Matlab性能問題的最佳答案。 –

+0

超過90%的時間花費在dataset.subsref的第262行上,這是奇怪的b/c,它是一個簡單的單元格取消引用。不幸的是,我給出的例子太簡單了,無法顯示。我會更新一個更現實的例子。 –

回答

3

是的,你很可能看到Matlab OOP方法調用的開銷。與單元索引或其他一些語言的方法調用相比,它們非常昂貴。您的.513872秒/ 1e4〜=每次通話51微秒,這是幾個MCOS方法調用的大致成本;他們在我見過的機器上每次約5-15微秒。所以這看起來像subsref()的方法開銷自己調用,其他方法和屬性訪問它依次調用。

對於一些細節和討論,請參見:Is MATLAB OOP slow or am I doing something wrong?

我不知道的一種方式,使這個速度,除了構建你的代碼,以儘量減少通話「ds.dat」或其他方法。如果可能,在處理數據集時,調用「ds.dat」一次,將其保存在局部變量中並在那裏使用,然後將其推回到ds對象。

警告:我不知道「功能加速」是什麼,或者它會如何影響這些時間。

編輯:我把它扔到像裏奇建議的剖析器。在我的R2009b上,看起來大約有一半的時間是方法調用開銷,其餘部分在subsref的find(),strcmp()和其他操作中; subsref不會依次調用任何其他方法。

編輯2:修改後的示例顯示更高的計時。方法調用開銷並不佔所有這些。

+0

是的,保存ds.dat是節省時間的好方法。我總是這樣做,如果我知道我將需要一個循環中的同一列。加速關閉關閉JIT,因此它不會扭曲單元陣列循環的時序。 –

相關問題