當(dāng)前位置:首頁 > 公眾號精選 > CPP開發(fā)者
[導(dǎo)讀]STL中稍不注意會產(chǎn)生性能開銷的地方STL容器的clear的時(shí)間復(fù)雜度不是O(1)可能很多人都不在意,在使用STL容器的時(shí)候,潛意識里面將clear()成員函數(shù)視為常量時(shí)間復(fù)雜度O(1)的。但是其實(shí)不然。我感覺可能是很多人都知道對于vector而言,clear()之后,修改了si...

STL中稍不注意會產(chǎn)生性能開銷的地方

STL容器的clear的時(shí)間復(fù)雜度不是O(1)

可能很多人都不在意,在使用STL容器的時(shí)候,潛意識里面將clear()成員函數(shù)視為常量時(shí)間復(fù)雜度O(1)的。但是其實(shí)不然。我感覺可能是很多人都知道對于vector而言,clear()之后,修改了size()的結(jié)果,不影響capacity()的結(jié)果,因而得出clear()只是修改了某個(gè)標(biāo)記,是常量時(shí)間復(fù)雜度的錯(cuò)誤結(jié)論。

其實(shí)C 標(biāo)準(zhǔn)明確指出不管是序列容器(比如vector)還是關(guān)聯(lián)容器(比如unordered_map)其clear()成員函數(shù)都是線性時(shí)間復(fù)雜度O(n)的。因?yàn)橹灰獔?zhí)行了clear()就需要對其存儲的元素調(diào)用析構(gòu)函數(shù),這個(gè)析構(gòu)操作顯然是逐個(gè)析構(gòu)的。因而時(shí)間復(fù)雜度是O(n)。

當(dāng)然在實(shí)踐中,也有個(gè)例。比如當(dāng)vector存儲基本數(shù)據(jù)類型或POD類型(比如基本數(shù)據(jù)類型構(gòu)成的struct)的時(shí)候,由于其元素類型沒有析構(gòu)函數(shù)(也不需要析構(gòu)函數(shù)),加之vector內(nèi)部連續(xù)存儲的特性,編譯器的實(shí)現(xiàn)是可以在常量時(shí)間完成clear()的。

Linear in size(destructions). This may be optimized to constant complexity for trivially-destructible types(such as scalar or PODs), where elements need not be destroyed

http://www.cplusplus.com/reference/vector/vector/clear

當(dāng)然僅限于vector存儲基本數(shù)據(jù)類型和POD類型的時(shí)候,編譯器可能有此優(yōu)化。如果vector存儲的是其他類型的對象,或者是其他容器(比如list、map、unordered_map)都是沒辦法做這個(gè)優(yōu)化的!

所以在工程實(shí)踐中,我們要思考是否每次都需要及時(shí)的clear掉一個(gè)容器。比如在后臺服務(wù)中,有些容器類型的變量在命中某些條件下要進(jìn)行clear(),后續(xù)邏輯中判斷容器是空的,就不在用之進(jìn)行某些邏輯(比如遍歷它,進(jìn)行某種操作)。

其實(shí)也可以用一個(gè)bool標(biāo)記來存儲后續(xù)是否需要遍歷該容器,待到本次請求的響應(yīng)返回給client之后,再來清理這個(gè)容器也不遲。

當(dāng)然這種操作在容器的元素個(gè)數(shù)不多的時(shí)候是完全沒有必要的,會喪失一些可讀性。不過這種思考還是需要有的。如果元素過多的時(shí)候,或許可能是性能優(yōu)化的一個(gè)小點(diǎn)。

auto替代手寫類型

比如在基于范圍的循環(huán)中盡量使用auto
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

騰盛博藥生物科技有限公司公布了兩項(xiàng)在美國健康志愿者中開展的評估長效BRII-732和BRII-778的1期研究最新數(shù)據(jù),這兩種在研候選藥物旨在用于治療人類免疫缺陷病毒(HIV)感染。兩項(xiàng)研究結(jié)果均表明,BRII-732和...

關(guān)鍵字: FIR ST RS

標(biāo)普500指數(shù)今年迄今為止下跌22.7%,但高盛(Goldman Sachs)策略師認(rèn)為估值依然太高。摩根士丹利旗下的Morgan Stanley Wealth Management稱,面對高通脹環(huán)境下的利率大幅上升,股...

關(guān)鍵字: DMA MANAGEMENT 高通 ST

奈飛(Netflix)今年早些時(shí)候從數(shù)據(jù)中看到了一個(gè)令人擔(dān)憂的信號:用戶訪問該流媒體服務(wù)的頻率下降了。該公司對其用戶在四周時(shí)間里觀看其內(nèi)容的天數(shù)進(jìn)行了跟蹤,并擔(dān)心訪問頻率的下降會增加用戶取消訂閱的可能性。在發(fā)現(xiàn)這一問題之...

關(guān)鍵字: 信號 流媒體 TI ST

鄭州2022年10月17日 /美通社/ -- 近日,《福布斯》發(fā)布了"2022年全球最佳雇主榜單"(The World's Best Employers 2022),中國平安再度上榜并排名全...

關(guān)鍵字: 福布斯 ST TI BSP

蘇州2022年10月17日 /美通社/ -- 開拓藥業(yè)(股票代碼:9939.HK),一家專注于潛在同類首創(chuàng)和同類最佳創(chuàng)新藥物研發(fā)及產(chǎn)業(yè)化的生物制藥公司,宣布其自主研發(fā)、潛在同類首創(chuàng)的福瑞他恩(KX-826)治療痤瘡的中國...

關(guān)鍵字: ST FDA 代碼 ADI

(全球TMT2022年10月11日訊)數(shù)字網(wǎng)絡(luò)集成商STL宣布與Vocus Group合作開展西澳大利亞的地平線項(xiàng)目。在此次合作中,STL將為Vocus的國際資本網(wǎng)絡(luò)擴(kuò)展計(jì)劃提供高強(qiáng)度光纖電纜。這項(xiàng)交易加強(qiáng)了STL與V...

關(guān)鍵字: 光纖網(wǎng)絡(luò) ST 電纜 GROUP

馬斯克(Elon Musk)旗下的SpaceX公司已開始在日本提供運(yùn)用衛(wèi)星通信技術(shù)的互聯(lián)網(wǎng)服務(wù)“Starlink(星鏈)”。日本是首個(gè)展開該服務(wù)的亞洲國家。該公司打算用該服務(wù)來抓住日本的山區(qū)和離島等確保通信手段的需求。官...

關(guān)鍵字: LINK ST SPACEX 互聯(lián)網(wǎng)

Meta在年度大會上發(fā)布新款VR頭盔Quest Pro,售價(jià)1500美元。Quest Pro使用手機(jī)內(nèi)部和周圍的攝像頭來捕捉面部運(yùn)動(dòng),它可以實(shí)時(shí)將這些捕捉到的信息應(yīng)用于用戶的頭像和表情。 (全球企業(yè)動(dòng)態(tài))...

關(guān)鍵字: VR ST 手機(jī) 攝像頭

Meta Quest Pro定于本月25日面市,定價(jià)1500美元。零售包裝內(nèi)含頭戴裝置,Quest Touch Pro手柄,充電底座,壓感筆尖(手柄附件),部分遮光罩(另有全遮光罩可選)。開發(fā)單位宣稱Meta Quest...

關(guān)鍵字: ST AN 傳感器 GB

金融科技公司Airwallex空中云匯宣布完成1億美元E2輪融資?,F(xiàn)有投資方Square Peg、Salesforce Ventures、紅杉中國、Lone Pine Capital、和暄資本、1835i和騰訊參與了本輪...

關(guān)鍵字: AIR API 騰訊 ST

CPP開發(fā)者

234 篇文章

關(guān)注

發(fā)布文章

編輯精選

技術(shù)子站

關(guān)閉