我試圖擠壓腳本的執行時間,避免無用的大矩陣重新分配。 一種像矩陣重新分配
B = A;
操作引起的小的開銷,因爲B
將以A
相同的結構點,並且直到更新發生Matlab的將不分配一個新的。
但是,這樣的操作呢?
longVector = longVector(1:n);
將它簡單地更新longVector
結構指向數據更已經存在的子集或(更昂貴的時間)將導致其分配一個新的載體和垃圾舊的?
我試圖擠壓腳本的執行時間,避免無用的大矩陣重新分配。 一種像矩陣重新分配
B = A;
操作引起的小的開銷,因爲B
將以A
相同的結構點,並且直到更新發生Matlab的將不分配一個新的。
但是,這樣的操作呢?
longVector = longVector(1:n);
將它簡單地更新longVector
結構指向數據更已經存在的子集或(更昂貴的時間)將導致其分配一個新的載體和垃圾舊的?
是的,它會縮小分配的塊,但隨着時間的推移它會導致碎片(在Windows系統上)。
我不確定這是否會更好(我沒有測試過這個區別),但是您可以改爲嘗試longVector(n+1:end)=[]
。我非常肯定,不會分配一個新的變量。
看起來像這樣,比'longVector'初始化本身佔用更多的時間 – Batsu
確保使用你在一個函數內進行計時的代碼完成所有的計時,否則很多優化都不會被應用。嘗試在MATLAB Central File Exchange中使用Steve Eddins的'timeit'函數,該函數爲您處理了許多微妙的問題,比如通過運行幾次來升溫代碼。話雖如此 - 我並不是暗示你會得到不同的結果。 –
相信在MATLAB
A = B;
,除非隨後
clear B;
使用了最少的內存的兩倍。 至少在Mac和最多幾個版本(2009年左右),它是如此。
順便說一句,你不明白你想在這裏實現什麼? 爲什麼這會提高你的表現?
好吧,我運行了一些粗略的分析...'清除所有; CLC; tic A = ones(1,100000); toc tic A = A(1:50000); toc tic B = ones(1,50000); toc tic B = A; toc'。 「A」大小調整需要與「B」分配大致相同的時間(因此它看起來不僅僅是重新引用舊的分段),而最後的分配時間的量級要小得多。 – Batsu