[英]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.