亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

seo常用優(yōu)化技巧 網(wǎng)站代碼優(yōu)化工具( 四 )


相比哈希表和紅黑樹(shù),跳表用的不那么多 。
### 數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)優(yōu)化
我們通常只會(huì)講數(shù)據(jù)的邏輯結(jié)構(gòu),但數(shù)據(jù)的實(shí)現(xiàn)(存儲(chǔ))結(jié)構(gòu)也會(huì)影響性能 。
數(shù)組在存儲(chǔ)上一定是邏輯地址連續(xù)的,但鏈表不具有這樣的特點(diǎn),鏈表通過(guò)鏈域?qū)ふ遗R近節(jié)點(diǎn),如果相鄰節(jié)點(diǎn)在地址上發(fā)散,則沿著鏈域訪問(wèn)效率不高,所以實(shí)現(xiàn)上可以通過(guò)從單獨(dú)的內(nèi)存配置器分配結(jié)點(diǎn)(盡量?jī)?nèi)存收斂)來(lái)優(yōu)化訪問(wèn)效率,同樣的方法也適應(yīng)紅黑樹(shù)、哈希表等其他結(jié)構(gòu) 。
### 排序
盡量對(duì)指針、索引、ID排序,而不要對(duì)對(duì)象本身排序,因?yàn)榻粨Q對(duì)象比交換地址/索引慢;求topN不要做全排序;非穩(wěn)定排序能滿(mǎn)足要求不要搞穩(wěn)定排序 。
### 延遲計(jì)算 & 寫(xiě)時(shí)拷貝
延遲計(jì)算和寫(xiě)時(shí)拷貝(COW)思想上是一樣的,即可以通過(guò)把計(jì)算盡量推遲來(lái)減少計(jì)算開(kāi)銷(xiāo) 。
我拿游戲服務(wù)器開(kāi)發(fā)來(lái)舉例,假設(shè)玩家的戰(zhàn)斗力(fight)是通過(guò)等級(jí),血量,稱(chēng)號(hào)等其他屬性計(jì)算出來(lái)的,我們可以在等級(jí)、血量、稱(chēng)號(hào)變化的時(shí)候立即重算fight,但血量可能變化比較頻繁,所以就會(huì)需要頻繁重算戰(zhàn)力 。通過(guò)延遲計(jì)算,我們可以為戰(zhàn)力添加一個(gè)dirtyFlag,在等級(jí)、血量、稱(chēng)號(hào)變化的時(shí)候設(shè)置dirtyFlag,等到真正需要用到戰(zhàn)力的時(shí)候(GetFight函數(shù))里判斷dirtyFlag,如果dirtyFlag為true則重算戰(zhàn)力并清dirtyFlag,如果dirtyFlag為false則直接返回fight值 。
寫(xiě)時(shí)拷貝(COW)跟這個(gè)差不多,linux kernel在fork進(jìn)程的時(shí)候,子進(jìn)程會(huì)共享父進(jìn)程的地址空間,只有在子進(jìn)程對(duì)自身地址空間寫(xiě)的時(shí)候,才會(huì)clone一份出來(lái),同樣,string的設(shè)計(jì)也用到了類(lèi)似的思想 。
### 預(yù)計(jì)算
有些值可以提前計(jì)算出結(jié)果并保存起來(lái),不用重復(fù)計(jì)算的盡量不重復(fù)計(jì)算,特別是循環(huán)內(nèi)的計(jì)算,要避免重復(fù)的常量計(jì)算,C++甚至增加了一個(gè)constexpr的關(guān)鍵詞 。
### 增量更新
增量更新的原理不復(fù)雜,只做增量,只做DIFF,不做全量,這個(gè)思想有很多應(yīng)用場(chǎng)景 。
舉個(gè)例子,游戲服務(wù)器每隔一段時(shí)間需要把玩家的屬性(比如血量、魔法值等)同步到客戶(hù)端,簡(jiǎn)單的做法是把所有屬性打包一次性全發(fā)送過(guò)去,這樣比較耗費(fèi)帶寬,可以考慮為每個(gè)屬性編號(hào),在發(fā)送的時(shí)候,只發(fā)送變化的屬性 。
在發(fā)送端,編碼一個(gè)變化的屬性的時(shí)候,需要發(fā)送一個(gè)屬性編號(hào)+屬性值的對(duì)子,接收端類(lèi)似,先解出屬性編號(hào),再解出屬性值,這種方式可能需要犧牲一點(diǎn)CPU換帶寬 。
## 3、代碼優(yōu)化
### 內(nèi)存優(yōu)化
(a)小對(duì)象分配器
C的動(dòng)態(tài)內(nèi)存分配是介于系統(tǒng)和應(yīng)用程序的中間層,malloc/free本身體現(xiàn)的就是一種按需分配+復(fù)用的思想 。
當(dāng)你調(diào)用malloc向glibc的動(dòng)態(tài)內(nèi)存分配器ptmalloc申請(qǐng)6字節(jié)的內(nèi)存,實(shí)際耗費(fèi)的會(huì)大于6字節(jié),6是動(dòng)態(tài)分配塊的有效載荷,動(dòng)態(tài)內(nèi)存分配器會(huì)為chunk添加首部和尾部,有時(shí)候還會(huì)加一下填充,所以,真正耗費(fèi)的存儲(chǔ)空間會(huì)遠(yuǎn)大于6字節(jié),在我的機(jī)器上,通過(guò)malloc_usable_size發(fā)現(xiàn)申請(qǐng)6字節(jié),返回的chunk,實(shí)際可用的size為24,加上首尾部就更多了 。
但你真正申請(qǐng)(可用)的大小是6字節(jié),可見(jiàn),動(dòng)態(tài)內(nèi)存分配的chunk內(nèi)有大量的碎片,這就是內(nèi)碎片,而外碎片是存在chunk之間的,是另一個(gè)問(wèn)題 。
當(dāng)你申請(qǐng)的size較大,有效載荷 / 耗費(fèi)空間的比例會(huì)比較高,內(nèi)碎片占比不高,但但size較小,這個(gè)占比就高,如果這種小size的chunk非常多,就會(huì)造成內(nèi)存的極大浪費(fèi) 。
《C++設(shè)計(jì)新思維》一書(shū)中的loki庫(kù)實(shí)現(xiàn)了一個(gè)小對(duì)象分配器,通過(guò)隱式鏈表的方式解決了這個(gè)問(wèn)題,有興趣的可以去看看 。
(b)cached obj


以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問(wèn)題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專(zhuān)業(yè)人士給予相關(guān)指導(dǎo)!

「愛(ài)刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助: