亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > Golang 函數執行時間統計裝飾器的一個實現詳解

Golang 函數執行時間統計裝飾器的一個實現詳解

熱門標簽:西部云谷一期地圖標注 學海導航地圖標注 中國地圖標注省會高清 南通如皋申請開通400電話 江西轉化率高的羿智云外呼系統 地圖標注的汽車標 浙江高速公路地圖標注 高德地圖標注口訣 廣州呼叫中心外呼系統

背景

最近在搭一個新項目的架子,在生產環境中,為了能實時的監控程序的運行狀態,少不了邏輯執行時間長度的統計。時間統計這個功能實現的期望有下面幾點:

  1. 實現細節要剝離:時間統計實現的細節不期望在顯式的寫在主邏輯中。因為主邏輯中的其他邏輯和時間統計的抽象層次不在同一個層級
  2. 用于時間統計的代碼可復用
  3. 統計出來的時間結果是可被處理的。
  4. 對并發編程友好

實現思路

統計細節的剝離

最樸素的時間統計的實現,可能是下面這個樣子:

func f() {
 startTime := time.Now()
 logicStepOne()
 logicStepTwo()
 endTime := time.Now()
 timeDiff := timeDiff(startTime, endTime)
 log.Info("time diff: %s", timeDiff)
}

《代碼整潔之道》告訴我們:一個函數里面的所有函數調用都應該處于同一個抽象層級。

在這里時間開始、結束的獲取,使用時間的求差,屬于時間統計的細節,首先他不屬于主流程必要的一步,其次他們使用的函數 time.Now() 和 logicStepOne, logicStepTwo 并不在同一個抽象層級。

因此比較好的做法應該是把時間統計放在函數 f 的上層,比如:

func doFWithTimeRecord() {
 startTime: = time.Now()
 f()
 endTime := Time.Now()
 timeDiff := timeDIff(startTime, endTime)
 log.Info("time diff: %s", timeDiff)
}

時間統計代碼可復用統計結果可被處理不影響原函數的使用方式

我們雖然達成了函數內抽象層級相同的目標,但是大家肯定也能感受到:這個函數并不好用。

原因在于,我們把要調用的函數 f 寫死在了 doFWithTimeRecord 函數中。這意味著,每一個要統計時間的函數,我都需要實現一個 doXXWithTimeRecord, 而這些函數里面的邏輯是相同的,這就違反了我們 DRY(Don't Repeat Yourself)原則。因此為了實現邏輯的復用,我認為裝飾器是比較好的實現方式:將要執行的函數作為參數傳入到時間統計函數中。

舉個網上看到的例子

實現一個功能,第一反應肯定是查找同行有沒有現成的輪子。不過看了下,沒有達到自己的期望,舉個例子:

type SumFunc func(int64, int64) int64

func timedSumFunc(f SumFunc) SumFunc {
 return func(start, end int64) int64 {
  defer func(t time.Time) {
   fmt.Printf("--- Time Elapsed: %v ---\n", time.Since(t))
  }(time.Now())
  
  return f(start, end)
 }
}

說說這段代碼不好的地方:

這個裝飾器入參寫死了函數的類型:

type SumFunc func(int64, int64) int64

也就是說,只要換一個函數,這個裝飾器就不能用了,這不符合我們的第2點要求

這里時間統計結果直接打印到了標準輸出,也就是說這個結果是不能被原函數的調用方去使用的:因為只有掉用方,才知道這個結果符不符合預期,是花太多時間了,還是正?,F象。這不符合我們的第3點要求。

怎么解決這兩個問題呢?

這個時候,《重構,改善既有代碼的設計》告訴我們:Replace Method with Method Obejct——以函數對象取代函數。他的意思是當一個函數有比較復雜的臨時變量時,我們可以考慮將函數封裝成一個類。這樣我們的函數就統一成了 0 個參數。(當然,原本就是作為一個 struct 里面的方法的話就適當做調整就好了)

現在,我們的代碼變成了這樣:

type TimeRecorder interface {
 SetCost(time.Duration)
 TimeCost() time.Duration
}

func TimeCostDecorator(rec TimeRecorder, f func()) func() {
 return func() {
  startTime := time.Now()
  f()
  endTime := time.Now()
  timeCost := endTime.Sub(startTime)
  rec.SetCost(timeCost)
 }
}

這里入參寫成是一個 interface ,目的是允許各種函數對象入參,只需要實現了 SetCost 和 TimeCost 方法即可

對并發編程友好

最后需要考慮的一個問題,很多時候,一個類在整個程序的生命周期是一個單例,這樣在 SetCost 的時候,就需要考慮并發寫的問題。這里考慮一下幾種解決方案:

使用裝飾器配套的時間統計存儲對象,實現如下:

func NewTimeRecorder() TimeRecorder {
 return timeRecorder{}
}

type timeRecorder struct {
 cost time.Duration
}

func (tr *timeRecorder) SetCost(cost time.Duration) {
 tr.cost = cost
}

func (tr *timeRecorder) Cost() time.Duration {
 return tr.cost
}

抽離出存粹的執行完就可以銷毀的函數對象,每次要操作的時候都 new 一下

函數對象內部對 SetCost 函數實現鎖機制

這三個方案是按推薦指數從高到低排序的,因為我個人認為:資源允許的情況下,盡量保持對象不可變;同時怎么統計、存儲使用時長其實是統計時間模塊自己的事情。

單元測試

最后補上單元測試:

func TestTimeCostDecorator(t *testing.T) {
 testFunc := func() {
  time.Sleep(time.Duration(1) * time.Second)
 }
 
 type args struct {
  rec TimeRecorder
  f func()
 }
 
 tests := []struct {
  name string
  args args
 }{
  {
   "test time cost decorator",
   args{
    NewTimeRecorder(),
    testFunc,
   },
  },
 }
 for _, tt := range tests {
  t.Run(tt.name, func(t *testing.T) {
   got := TimeCostDecorator(tt.args.rec, tt.args.f)
   got()
   if tt.args.rec.Cost().Round(time.Second) != time.Duration(1) * time.Second.Round(time.Second) {
    "Record time cost abnormal, recorded cost: %s, real cost: %s",
    tt.args.rec.Cost().String(),
    tt.Duration(1) * time.Second,
   }
  }) 
 }
}

測試通過,驗證了時間統計是沒問題的。至此,這個時間統計裝飾器就介紹完了。如果這個實現有什么問題,或者大家有更好的實現方式,歡迎大家批評指正與提出~

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Golang記錄、計算函數執行耗時、運行時間的一個簡單方法
  • 通過匯編看golang函數的多返回值問題
  • Golang學習筆記之延遲函數(defer)的使用小結
  • Golang中的自定義函數詳解
  • golang 實現每隔幾分鐘執行一個函數

標簽:吐魯番 貴州 曲靖 東營 許昌 常州 德宏 保定

巨人網絡通訊聲明:本文標題《Golang 函數執行時間統計裝飾器的一個實現詳解》,本文關鍵詞  Golang,函數,執行,時間,統計,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang 函數執行時間統計裝飾器的一個實現詳解》相關的同類信息!
  • 本頁收集關于Golang 函數執行時間統計裝飾器的一個實現詳解的相關信息資訊供網民參考!
  • 推薦文章
    日韩在线观看视频网站| 欧美国产日韩久久久| 精品国产一区二区三区久久久蜜臀| 国产网站免费| 国产国语在线播放视频| 一级女人毛片人一女人| 久久99这里只有精品国产| 久草免费在线视频| 色综合久久天天综合观看| 九九九在线视频| 日韩中文字幕在线亚洲一区| 免费毛片播放| 成人免费高清视频| 成人av在线播放| 日日夜人人澡人人澡人人看免| 免费毛片播放| 欧美激情一区二区三区视频| 黄色福利| 国产一区国产二区国产三区| 可以免费看污视频的网站| 国产精品自拍在线| 国产a免费观看| 精品视频免费在线| 久久久成人影院| 久久国产精品自线拍免费| 九九干| 99热精品一区| 麻豆午夜视频| 国产极品白嫩美女在线观看看| 青青青草影院 | 亚洲精品中文字幕久久久久久| 黄色福利| 久草免费在线色站| 精品视频一区二区三区免费| 美女免费精品高清毛片在线视| 国产视频一区二区在线观看| 久久99这里只有精品国产| 免费国产在线视频| a级毛片免费观看网站| 精品久久久久久免费影院| 亚洲爆爽| 日韩男人天堂| 沈樵在线观看福利| 欧美一区二区三区在线观看| 日本在线不卡免费视频一区| 日韩专区亚洲综合久久| 黄色福利| 中文字幕97| 国产成a人片在线观看视频| 欧美日本二区| 欧美国产日韩一区二区三区| 可以免费看污视频的网站| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 色综合久久天天综合绕观看| 日韩专区一区| 日韩免费在线观看视频| 韩国三级视频网站| 青青青草影院 | 精品国产一区二区三区久久久蜜臀| 中文字幕一区二区三区精彩视频 | 久久久久久久网| 亚洲女人国产香蕉久久精品| 日韩免费片| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 欧美1区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 亚州视频一区二区| 香蕉视频一级| 麻豆系列 在线视频| 一a一级片| 国产麻豆精品hdvideoss| 国产伦精品一区二区三区在线观看| 精品国产亚洲一区二区三区| 日韩专区一区| 超级乱淫黄漫画免费| 国产网站在线| 日日夜夜婷婷| 精品视频免费观看| 黄视频网站在线看| 国产激情一区二区三区| 午夜在线影院| 免费毛片播放| 香蕉视频久久| 成人a级高清视频在线观看| 欧美18性精品| 尤物视频网站在线观看| 高清一级片| 可以在线看黄的网站| 国产视频久久久| 日韩一级黄色| 国产精品免费久久| 日日日夜夜操| 国产一区二区福利久久| 国产视频在线免费观看| 久草免费在线色站| 一a一级片| 国产麻豆精品hdvideoss| 国产网站免费| 亚飞与亚基在线观看| 国产视频一区在线| 亚洲精品永久一区| 成人影视在线播放| 亚洲精品影院久久久久久| 你懂的日韩| 欧美一区二区三区在线观看| 午夜欧美福利| 国产91视频网| 久久国产影院| 亚洲爆爽| 国产不卡在线观看| 国产成人精品一区二区视频| 一本伊大人香蕉高清在线观看| 超级乱淫黄漫画免费| 九九免费高清在线观看视频| 99色视频在线| 欧美激情一区二区三区在线| 亚洲女人国产香蕉久久精品 | 黄视频网站免费观看| 国产不卡精品一区二区三区| 欧美日本免费| 中文字幕97| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 欧美a级大片| 精品国产一区二区三区久| 成人免费观看男女羞羞视频 | 色综合久久天天综合观看| 欧美激情一区二区三区在线播放| 国产伦久视频免费观看 视频| 九九久久99综合一区二区| 精品视频免费在线| 国产不卡在线播放| 日韩免费在线视频| 国产视频一区在线| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 欧美激情一区二区三区中文字幕| 国产不卡在线看| 国产91丝袜在线播放0| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 精品国产一区二区三区久久久狼| 欧美a免费| 高清一级毛片一本到免费观看| 成人免费观看网欧美片| 国产精品自拍在线| 国产亚洲精品成人a在线| 黄视频网站免费| 青青久久精品| 日韩av片免费播放| 高清一级片| 欧美大片aaaa一级毛片| 久久国产影视免费精品| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 免费的黄色小视频| 日韩男人天堂| 免费一级片在线观看| 可以免费看污视频的网站| 国产不卡精品一区二区三区| 久久国产影视免费精品| 日韩中文字幕在线观看视频| 日韩中文字幕一区| 九九九在线视频| 欧美激情伊人| 日韩欧美一二三区| 91麻豆高清国产在线播放| 国产极品精频在线观看| 日本伦理网站| 麻豆系列国产剧在线观看| 国产不卡在线看| 国产麻豆精品hdvideoss| 你懂的日韩| 久草免费资源| 尤物视频网站在线观看| 精品国产一区二区三区国产馆| 久久福利影视| 韩国三级视频网站| 一级女性大黄生活片免费| 成人影院一区二区三区| 亚洲爆爽| 国产一区精品| 精品久久久久久影院免费| 日本乱中文字幕系列| 日日夜夜婷婷| 亚洲www美色| 免费毛片播放| 午夜久久网| 美女免费黄网站| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产伦理精品| 国产极品精频在线观看| 午夜欧美成人久久久久久| 国产一区二区福利久久| 欧美爱色| 亚洲女人国产香蕉久久精品| 成人免费观看网欧美片| 久久99欧美| 亚洲精品影院| 国产高清视频免费| 免费国产在线视频| 国产高清视频免费| 99久久精品国产国产毛片| 欧美a级成人淫片免费看|