2014-05-02 45 views
3

我微優化內部循環,撞上東西,我不會在探查瞭解(R2013b):剖析幫助:緩慢矩陣標量分配

profiler output

C是2×2矩陣,x和y是數據,其他的都是標量。爲什麼第33行和第34行之間的速度差別都是做同樣的事情 - 爲數組中的條目分配一個標量。如果我交換這兩條線的行爲是相同的,那麼第二條線要慢得多。

這是一個分析器錯誤還是有什麼事情我不明白?即使當我放大到幾分鐘時,該比率也是相同的(例如,第32行和第34行是同一時間)。我看不到任何寫入時拷貝或類似的東西會在這裏觸發,所以速度差異對我來說沒有任何意義。在這裏節省30%對我來說是一個巨大的勝利。

感謝所有幫助

+1

嘗試將這些行更改爲'C(2)= Cxy;'和'C(3)= Cxy;'(即線性索引),以免它可以幫助 –

+0

好主意!它會稍微加速(在探查器外部運行時會更明顯),但不會改變34和32的數量級相同並且數量級大於33的4倍的事實。 – robince

回答

1

我相信,第二個是比較慢的原因,是不是在該行的內容,但更多的時候矩陣實際上是將被使用。在第一行中,matlab'知道'它不需要做任何事情,因爲下一行是在C中的一個獨立變化。

如果您想驗證它不在行的內容中,請在下面添加類似C(1,1)=Cxy的內容作爲第三行,可能現在前兩行中都會顯示爲快。

基本上這意味着你可能不會增加很多速度。

也許你可以嘗試邏輯索引,因爲它可能會稍快(未經測試)。

C([false true; true false]) = Cxy; 

或者是線性的邏輯索引:

C([false true true false]) = Cxy; 

對於什麼是值得的,我猜想,整個效果是由於只是在時間原則Matlab的如下。

+0

感謝您的建議。我添加了第三個作業,但實際上它很快,第二個Cxy作業仍然很慢:http://i.imgur.com/yfYPCkg.png另外,我對您的JIT有所瞭解 - 但我很驚訝這些效果可能會是如此之大......第32行是兩個3500多個長度向量之間的點積 - 即使是兩個標量分配也應該花費相同時間量的想法似乎並不合理! – robince

+0

實際上,邏輯索引對探查器的輸出做出了很大的改變...... http://i.imgur.com/O5BdNFw.png它沒有在探查器外部保存大量循環的運行時間,但它確實使得輸出更明智。然後,再次將兩個正常的作業放在一條線上也會修復profiler輸出http://i.imgur.com/FGecOkW.png,所以我想這是一個探查器的bug /怪癖...... – robince

+0

@robince the line你在第一個註釋中添加的內容不會做任何事情,請嘗試用'Cxy'替換'Cx'來查看會發生什麼。 –