先說一下此次要作什麼, 咱們天天都須要同步一次本部門人員詳細信息. 可是隻有兩個接口可用:node
在得到詳細信息之後須要篩選出本部門的人員信息, 也就是org
字段中包含雲部門
的數據, 篩選出的數據算是最新人員名單, 對比數據庫中已有的數據, 作增量更新(也就是不存在的補上就夠了).golang
我剛拿到這個任務簡直無語, 真他媽無聊到批爆 ... fuck! 可是又隱約想起這彷佛是我之前遇到過的一個面試題, 簡單想一想好像沒什麼嘛, 可是在30萬的數量級, daily basis的狀況下. 任何微小的浪費都會被放大, 這樣一下就有意思了, 能作確定是能作, 可是怎麼作會比較"快", 比較"經濟"(不浪費內存), 針對這種狀況, 如今市面上有這些流言, 他們說:面試
for _,item := range array
中間會有一次值拷貝, 而range array[index]沒有
咱們會從時間+內存+CPU佔用的狀況分析某個策略的好壞, 時間的話好辦, 那麼內存+CPU數據應該怎麼捕捉呢? 我知道有不少種方式, 目前比較常見的(網上教程比較多的)方法是經過pprof的方法來作. 我如今是經過最簡單最naive的方式實現了個人需求, 在我定位出了我面臨的問題之後, 我就能夠一個一個去驗證網上的這些"流言" (其實我想知道他們在說這些以前, 本身有沒有真的實踐過)數據庫
在開始用pprof以前, 先介紹一下這個工具, 這個概念:json
大部分市面上的教程呢, 都是教教你怎麼畫火焰圖, 調用圖而後就結束了. 我以爲pprof這個單詞有點鬼畜, 我就從定義開始說, 單獨搜了一下這個詞是什麼含義, 將它拆成兩段: pprof = p + prof = Package Profiling. Packge就是你的程序, Prof就是Profile的簡寫, Profile是指一組棧追蹤信息. 指, 當你但願完成一個事件的時候, 全部的棧調用信息.數組
那麼咱們就理解了, pprof是指咱們程序運行的時候, 來作棧分析, 進一步往下, 分析的內容能夠是CPU, 也能夠是內存分配分析等, 對應下來, 這個工具就提供了相應的指標供你觀察, 咱們從最小, 但卻最經常使用最簡單的指標開始學習: ( 想學習最全面的指標, 能夠點擊這裏 → 完整的指標 )函數
爲了佈置pprof, 你一共有兩種方式, 兩句話歸納這兩種方式, 它們分別是:工具
runtime/pprof
:
net/http/pprof
: (咱們使用這種方式)
import _ "net/http/pprof"
func main() {
go func() {
http.ListenAndServe("localhost:6060", nil)
}
}
複製代碼
在pprof觀察點設置好了之後, 咱們讓程序運行起來, 而後在**命令行中輸入命令: go tool pprof http://localhost:6060/debug/pprof/profile
來得到CPU分析結果, 輸入命令之後須要等待30秒鐘等待採樣完成. 隨後就進入命令行模式, 咱們經過top5命令**查詢CPU佔用前五高的函數post
這樣咱們就能得到, 在這30秒裏, 在CPU上都發生了什麼, 接下來, 咱們來詳細分析一下這裏面的一些指標都是什麼含義:學習
一樣的, 咱們使用這個命令來查看內存的使用狀況: go tool pprof http://localhost:6060/debug/pprof/heap
跟上面的分析相似, 咱們能發如今咱們的程序中, 內存消耗大戶是strings調用的函數, 以及json調用的函數. 若是你想知道更多, 咱們還能從網頁版裏面驗證這些說法:
太好拉, 經過堆棧調用信息, 一下就他媽破案了, 咱們內存佔用大戶主要來自這兩個函數的反覆調用:
我不是說這兩個函數有問題, 你們之後不要用了, 不是這樣的, 只是說在個人程序中, 我反覆調用了這兩個函數, 不停的分配新內存. 如今真是太好了, 在"優化程序"這個巨大的話題中, 咱們至少已經定位出了咱們的問題, 圍繞咱們的問題, 咱們不用像無頭蒼蠅同樣了, 咱們能夠針對問題想辦法了 :)
總結一下我遇到的問題:
流言都是真的嗎? 它們適用於個人狀況嗎? 又有多大程度的效果? 下次繼續更新