2012-01-03 233 views
5

我在程序中運行了一個分析器(非常睏倦),並且在我的重置功能(重置功能每幀運行)上顯示出很高的百分比。 的程序是這樣的:vector :: clear()花費那麼多時間?

INIT部分:

std::vector<std::vector<int>> VecOfVecOfPath; 
VecOfVecOfPath.resize(20); 
for(int i=0; i<20; i++) VecOfVecOfPath.reserve(640); 

VecOfVecOfPath是一系列路徑的其他功能找到。 VecOfVecOfPath [i]將在每幀執行期間填充。 例如它由其他功能執行,並在每幀使用之前復位。

復位功能:

void Reset() 
{ 
for(int i=0; i<20; i++) VecOfVecOfPath[i].clear(); 
} 

所以重置很簡單,但它確實有一個分析器相當高的排名。

這是常見的嗎? vector :: clear()是否甚至對於內置類型向量也有這樣的開銷?

謝謝!


我試着在發佈模式下構建程序,然後成本降低到幾乎爲零。 從12〜13%到0.03〜0.04%。

然後我去了源代碼,並有像ITERATOR_DEBUG_LEVEL定義在調試模式下影響額外的操作。

所以它就像@ noggin182建議的一樣,在調試和發佈模式下情況有所不同。

引用:「Meke確保在發佈版本的分析和搜索,看看是否有任何預處理條件定義設置以提高性能 - noggin182 1月3日在15:32。」

+0

你認爲你是不必要地調用'clear'嗎? – 2012-01-03 14:51:42

+0

@parapurarajkumar - 我的第一件事也發生在我身上。我想我們需要更多關於'VecOfVec'的使用細節 - 也許Vecs可以回收以避免明顯。 – 2012-01-03 14:56:57

+4

向量的矢量是什麼? – 2012-01-03 14:57:06

回答

1

這要看是什麼在你的向量中,如果你的嵌套向量包含類,那麼你將調用嵌套向量中每個實例的矩陣。我很確定它也將釋放內存。

這聽起來像你正在寫一個遊戲?如果是這樣的話,我在遊戲寫作中閱讀過的幾本書(PDF)表明,矢量對於一般用途來說是好的,但是你最好不要將它用於遊戲。只需使用本地數組並自己管理內存或者滾動您自己的容器類。

640是你的向量的上界嗎?你會更好地使用這樣的東西嗎?

sometype Values[20][640]; 
int size[20]; 

然後你重置通話可能只是

for(int i=0; i<20; i++) size[0] = 0; 

您仍然甚至能夠使用任何STL的功能是這樣的:

std::sort(Values[i], Values[i] + size[i]); 

這是對儘可能多的幫助,因爲我可以提供沒有任何更多的信息

+0

它是int類型的,所以我認爲它不需要太多時間來清除()它。我認爲本地數組是否與向量相同,如果我正確地保留()爲它?然後矢量不會重新分配,所以速度很快。 – 2012-01-03 15:14:19

+0

好吧,如果它是一個int向量,那麼我會認爲這應該不會那麼慢。你使用什麼編譯器?我沒有看到vector的所有實現,但我很驚訝他們在MSVC,Borland和GCC之間有多麼不同。它們都具有開關,以啓用某些理智和調試檢查,並執行範圍檢查和屏蔽等任務,確保您只在容器上使用迭代器。確定你正在分析發佈版本和搜索,看看是否有任何預先設定的條件定義來提高性能。 – noggin182 2012-01-03 15:32:32

+0

我正在使用VS2010專業版。我會在今天晚些時候嘗試發佈版本並報告結果,謝謝! – 2012-01-04 00:24:41