欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

盤(pán)點(diǎn)Go中的開(kāi)發(fā)神器

本文已收錄 https://github.com/lkxiaolou/lkxiaolou 歡迎star。

在明溪等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需開(kāi)發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營(yíng)銷,成都外貿(mào)網(wǎng)站建設(shè),明溪網(wǎng)站建設(shè)費(fèi)用合理。

在Java中,我們用Junit做單元測(cè)試,用JMH做性能基準(zhǔn)測(cè)試(benchmark),用async-profiler剖析cpu性能,用jstack、jmap、arthas等來(lái)排查問(wèn)題。
作為一名比較新的編程語(yǔ)言,golang的這些工具是否更加好用呢?

單元測(cè)試

Java的單元測(cè)試需要使用第三方庫(kù),一般是Junit,配置起來(lái)比較復(fù)雜。在使用了golang之后發(fā)現(xiàn)golang自帶的單元測(cè)試真的非常簡(jiǎn)單。
如果我們有一個(gè)cal.go文件,那么其對(duì)應(yīng)的單元測(cè)試文件為cal_test.go,其中的方法命名必須為T(mén)estXxx,這種按照命名進(jìn)行單元測(cè)試的方式簡(jiǎn)單有效,也正是通常所說(shuō)的“約定大于配置”。
來(lái)看一個(gè)簡(jiǎn)單的例子:

package unit

func add(a int, b int) int {
   return a + b
}

func sub(a int, b int) int {
   return a - b
}
package unit

import (
    "github.com/stretchr/testify/assert"
    "testing"
)

func TestAdd(t *testing.T) {
    assert.Equal(t, 10, add(5, 5))
}

func TestSub(t *testing.T) {
    assert.Equal(t, 0, sub(5, 5))
}

執(zhí)行單元測(cè)試只需要運(yùn)行(更多用法參考go help test)

go test --cover cal_test.go cal.go -v

benchmark

和單元測(cè)試類似,golang的benchmark也是開(kāi)箱即用。在cal_test.go基礎(chǔ)上增加一個(gè)BenchmarkAdd方法

package unit

import (
   "github.com/stretchr/testify/assert"
   "testing"
)

func TestAdd(t *testing.T) {
   assert.Equal(t, 10, add(5, 5))
}

func TestSub(t *testing.T) {
   assert.Equal(t, 0, sub(5, 5))
}

func BenchmarkAdd(b *testing.B) {
   for i:= 0; i < b.N; i++ {
      add(5, 5)
   }
}

執(zhí)行即可(更多用法參考go help test)

go test -bench=. -cpu=4 -count=3

pprof

pprof是golang自帶的可以用來(lái)做cpu、內(nèi)存、鎖分析的工具,非常類似java的async-profiler。
pprof的使用非常簡(jiǎn)單,只需要在代碼中引入net/http/pprof包,然后監(jiān)聽(tīng)一個(gè)端口即可。
一個(gè)簡(jiǎn)單的例子如下:

package main

import (
    "fmt"
    "log"
    "net/http"
    "time"
    _ "net/http/pprof"
)

func main() {
    go func() {
        //example: visit http://127.0.0.1:6060/debug/pprof in browser.
        err := http.ListenAndServe("0.0.0.0:6060", nil)
        if err != nil {
            fmt.Println("failed to start pprof goroutine:", err)
        }
    }()

    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe("localhost:8000", nil))
}

func handler(w http.ResponseWriter, r *http.Request) {
    time.Sleep(1 * time.Second)
    eat()
    time := time.Now().Unix() * 2 + 
    fmt.Fprintf(w, "URL.Path = %q; time = %d\n", r.URL.Path, time)
}

func eat() {
    loop := 
    for i := 0; i < loop; i++ {
        // do nothing
    }
}

在命令行中輸入

go tool pprof http://127.0.0.1:6060/debug/pprof/profile

同時(shí)不停的請(qǐng)求,讓pprof能采集到數(shù)據(jù),這里我的請(qǐng)求是

curl http://127.0.0.1:8000/hello

等待30秒后,采集結(jié)束會(huì)顯示采集文件的地址

Saved profile in /Users/roshi/pprof/pprof.samples.cpu.003.pb.gz

此時(shí)可以使用top等命令直接查看cpu消耗過(guò)高的函數(shù),更多命令可以使用help查看。

或者把文件下載下來(lái)用可視化的界面來(lái)分析,可以使用

go tool pprof -http=":8080" /User/roshi/pprof/pprof.samples.cpu.003.pb.gz

來(lái)開(kāi)啟一個(gè)可視化的頁(yè)面,查看,如果報(bào)錯(cuò)需要安裝graphviz,安裝文檔在這里可以查找:https://graphviz.gitlab.io/download/

訪問(wèn) http://localhost:8080/ui/ 可以看到下圖,其中面積最大的塊表示消耗cpu最多

這里有一篇文章對(duì)pprof介紹的很仔細(xì),可以參考:https://blog.wolfogre.com/posts/go-ppof-practice/

dlv

pprof很好用,但有一個(gè)缺點(diǎn)是必須事先在代碼中開(kāi)啟,如果線上出問(wèn)題且沒(méi)有開(kāi)啟pprof,可能就需要類似jstack、jmap、arthas等這類工具來(lái)排查。這里推薦一個(gè)最近使用過(guò)非常好用的golang問(wèn)題排查利器——dlv,項(xiàng)目地址見(jiàn)

https://github.com/go-delve/delve

它很有用的一個(gè)功能是attach,可以attach到正在運(yùn)行的golang程序,查看goroutine。這點(diǎn)可以很好的排查線上問(wèn)題。
各個(gè)平臺(tái)的安裝在github上寫(xiě)的很清楚,需要說(shuō)明的是安裝dlv的golang版本和要排查進(jìn)程的golang版本需要保持一致。
先寫(xiě)一個(gè)測(cè)試程序,起兩個(gè)goroutine,一個(gè)運(yùn)行,一個(gè)阻塞

package main

import (
   "fmt"
   "sync"
)

func main()  {
   go count()
   go wait()
   wait()
}

func count()  {
   count := 0
   for {
      count = count + 1
      if count %  == 0 {
         fmt.Println("I'm a running routine")
      }
   }
}

func wait()  {
   wg := sync.WaitGroup{}
   wg.Add(1)
   wg.Wait()
}

運(yùn)行起來(lái),然后使用dlv進(jìn)行attach,如下圖(具體命令可以attach后使用help查看)

這樣很方便地看到了各個(gè)goroutine在干啥


寫(xiě)在最后

作為一門(mén)比較新的編程語(yǔ)言,golang對(duì)現(xiàn)有語(yǔ)言取其精華,自帶必要的工具,進(jìn)一步降低門(mén)檻,對(duì)新手學(xué)習(xí)來(lái)說(shuō)非常友好。


搜索關(guān)注微信公眾號(hào)"捉蟲(chóng)大師",后端技術(shù)分享,架構(gòu)設(shè)計(jì)、性能優(yōu)化、源碼閱讀、問(wèn)題排查、踩坑實(shí)踐。

新聞標(biāo)題:盤(pán)點(diǎn)Go中的開(kāi)發(fā)神器
網(wǎng)頁(yè)網(wǎng)址:http://chinadenli.net/article8/dsoisip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航網(wǎng)頁(yè)設(shè)計(jì)公司、企業(yè)網(wǎng)站制作、建站公司、企業(yè)建站、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)