大家好,我是威哥,《RocketMQ技術內幕》一書作者,榮獲RocketMQ官方社區優秀布道師、CSDN2020博客執之星Top2等榮譽稱號,目前擔任中通快遞技術平臺部資深架構師,主要負責全鏈路壓測、訊息中間件、資料同步等產品的研發與落地,擁有千億級訊息集群的運維經驗,不僅實踐經驗豐富,而且對其源代碼有深入且系統的研究,歡迎大家關注我,一起抱團發展,
在面試的時候,當面試官問我們陣列與鏈表的差別時,大家在談到性能對比時應該會不約而同的提到:陣列在中間部分洗掉節點,由于會涉及到資料復制,其性能會低于鏈表,其操作說明如下圖所示:

正如圖中所述,洗掉中間節點3,需要將后面的資料,4,5分別向前移動一位,如果是洗掉陣列的頭部,整個陣列元素都會被移動,其性能開銷是非常大的,
但有其他解法沒?答案是有的,但可能需要破壞順序性語意,
破壞順序性語意,其實在很多場景下其實是可以接受的,
舉一個例子,我們在編程程序中,通常是需要從資料庫中按照指定的條件進行篩選,然后對其進行業務邏輯,容器初始時保留的是資料庫查詢時的順序,但其實業務邏輯處理并不要求我們嚴格按照資料庫的順序(條件順序),這個時候如果對其進行洗掉,其實是可以打破其順序性的,
如果可以打破順序性語意,對洗掉中間資料,可以不進行大量復制,說明如下:

我們洗掉中間的元素3,然后直接將陣列末的5寫入到3點位置,只需要復制一次,比復制待洗掉元素后面的節點,其性能能得到顯著提升,
打破常規思維,可能就是資料結構、演算法的魅力所在,讓我們一起開始學習資料與演算法,關注我,私信:刷演算法,共同抱團發展,
一鍵三連(關注、點贊、留言)是對我最大的鼓勵,
打造完備分布式架構體系

- 原始碼分析RocketMQ專欄(48篇+)
- 原始碼分析Sentinel專欄(12篇+)
- 原始碼分析Dubbo專欄(28篇+)
- 原始碼分析Mybatis專欄
- 原始碼分析Netty專欄(29篇+)
- 原始碼分析JUC專欄
- 原始碼分析Elasticjob專欄
- Elasticsearch專欄(20篇+)
- 原始碼分析MyCat專欄
- 原始碼分析Canal專欄
一鍵三連(關注、點贊、留言)是對我最大的鼓勵,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296881.html
標籤:其他
上一篇:手把手寫C++服務器(31):服務器性能提升關鍵——IO復用技術【兩萬字長文】
下一篇:樹和二叉樹的概念
