簡體   English   中英

std :: vector :: size()比手動跟蹤大小要慢嗎?

[英]Is std::vector::size() slower than keeping track of size manually?

std::vector::size()每次調用時都會重新計算向量的大小,還是維護一個僅在修改向量時修改的計數器? 例如,如果我有一個帶有std::vector<double>成員的類,那么在單獨的計數器中跟蹤它的大小會有什么速度上的好處嗎?

size()保證具有恆定的時間復雜度,並且在任何理智的實現中都將盡可能快地執行操作。

this->_Mylast - this->_myFirst 

通常涉及兩次內存提取。 如果將計數保持在寄存器中,則可能更快。 我說可能 ,因為在一個小循環中,減去的兩個值將在緩存中,這並不總是比寄存器慢很多 - 取決於機器。 一個聰明的編譯器,使用緊密循環,無論如何都可以在寄存器中維護,如果它正確地進行數據流分析。 在一個不那么小的循環中,你永遠不會注意到差異。 將其保存在寄存器中意味着每次迭代需要額外的操作來更新寄存器,如果它可以與其他操作並行完成,則可能是空閑的,或者它可能花費一個指令周期。 因此,衡量差異很難。

無論如何,您的里程根據處理器而有所不同,即使STL的每個實現都具有相同的size()代碼。

沒有必要在單獨的計數器中跟蹤它的大小,因為它是在向量內部完成的。 這個函數的代碼是這樣的:

iterator begin() {return start;}
iterator end() {return finish;}
size_type size() const { return size_type(end() - begin());}

iterator start;
iterator finish;

推送或彈出元素后,變量“start”,“finish”將被更改,因此函數size()只需要減去時間。 如果使用單獨的計數器,則在推或彈出元素時也會有一個加號或減號。

不 - 只需使用std::vector::size()

在MSVC上,它被實現為this->_Mylast - this->_Myfirst - 你無法擊敗它。

正如其他人所說,它幾乎不會變得更快。 只有在你的矢量大小不變的情況下,你才可以通過使用這個事實來節省一些cpu周期。 實際上,你可以跳過完全查詢大小。 這對於渲染循環中經常重復的迭代可能很重要。想象一下之間的區別:

// reset vector of size=3 to value 10

for( size_t i=0; i < myvec.size(); ++i )
{
   myvec[i] = 10.0;
}

 myvec[0] = myvec[1] = myvec[2] = 10.0;

一個典型的用例是一個3d坐標向量,一個ip-address等。但是要准備好用你自己的內部替換一些查詢size()的std :: vector例程。 因此,要點是,為了節省cpu周期,size運算符不是目標,尋找其他邏輯位置。 當你的矢量沒有改變它的大小時,即使是暫時的,你也有一只腳可以擠出一些cpu周期。

PS: Valgrind是你的朋友,先告訴你哪里優化。 事實上,大小運算符經常成為最佳候選者; 至少對於某些算法。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM