善用 Go 語言效能測試工具來提升執行效率

golang logo

在 AI 訓練模型前,都需要經過大量的資料處理,而資料處理的速度在整個流程內扮演很重要的角色,寫出高效能的 Parser 能降低整體處理時間,那如何評估程式效能如何,以及如何快速找到效能瓶頸?本議程會帶大家了解 Go 語言內建的效能測試工具,透過 Benchmark 來找出程式效能瓶頸的地方,快速改善及優化,讓整個系統流程更順暢。也會順道分享 Go 在字串處理優化的一些小技巧。聽過此議程相信您對 Go 語言會有更深入的了解,如果你想寫出有效率的程式碼,本議程一定不能錯過。

[Read More]

Go 語言 Select Multiple Channel 注意事項

golang logo

相信大家都知道 Select 可以用來處理多個 Channel,但是大家有沒有想過一個情境,如果是 for 搭配 select 時,肯定會用一個 Timer 或 context 來處理 Timeout 或手動 Cancel,假設如果跟其他 Channel 同時到達時,官方說法是 Select 會隨機選擇一個狀況來執行,如果並非選到我們所要的 case 那就會造成情境或流程上的錯誤,而本影片就是講解該如何解決此問題,請大家務必詳細了解業務的需求,來決定程式碼架構該如何寫。

[Read More]

用 Go 語言實戰 Limit Concurrency 方法

golang logo

最近看到一篇文章討論的非常熱烈,就是『concurrency is still not easy』這篇文章甚至上了 Hack News,大家有興趣可以點進去看看,而本篇會用一個實際案例介紹為什麼作者會說寫 Concurrency 不是這麼容易。大家都知道在 Go 語言內,要寫 Concurrency 只要透過一個關鍵字 go 就可以輕易寫出,而多個 Goroutine 要溝通就是需要透過 Channel 方式,而網路上有一堆 Concurrency Pattern 提供給各位開發者,但是官方 Go 的標準庫內並沒有包含這些 Pattern,所以實作之後,說實在很難看出問題。文章內提到 gops 實作 Limit Concurrency 遇到系統整個 hang 住的問題?什麼是 Limit Concurrency,就是當系統有多個工作需要同時執行,但是需要限制 Concurrency 數量,避免整個資源都被吃光。底下來介紹文章內遇到的問題。

[Read More]

在 Go 語言內管理 Concurrency 的三種方式

golang logo

相信大家踏入 Go 語言的世界,肯定是被強大的 Concurrency 所吸引,Go 語言用最簡單的關鍵字 go 就可以將任務丟到背景處理,但是怎麼有效率的控制 Concurrency,這是入門 Go 語言必學的項目,本篇會介紹三種方式來帶大家認識 Concurrency,而這三種方式分別對應到三個不同的名詞: WaitGroup, Channel, 及 Context,底下用簡單的範例帶大家了解。

[Read More]

Go 1.15 新增 Module cache 環境變數

golang logo

相信各位開發者在寫 Go 語言專案,現在肯定都是使用 Go module 了,而 Go Module 檔案預設寫在 /go/pkg/mod 目錄內,要串 CI/CD 流程時,由於不在專案路徑底下,所以每一個 Container 無法共用 /go/pkg/mod 路徑,造成重複下載第三方套件,其實跨容器的解決方式可以透過 DroneTemporary Volumes 方式解決,但是最終希望跑完編譯流程時,可以將最後的 mod 目錄打包留到下次的 CI/CD 部署流程使用,這時候如果可以改變 /go/pkg/mod 路徑,就可以動態調整目錄結構了。底下是針對 Drone 這套部署工具進行解說。

[Read More]

Go 語言用 pprof 找出程式碼效能瓶頸

golang logo

Go 語言除了內建強大的測試工具 (go test) 之外,也提供了效能評估的工具 (go tool pprof),整個生態鏈非常完整,這也是我推薦大家使用 Go 語言的最大原因,這篇會介紹如何使用 pprof 來找出效能瓶頸的地方。假設開發者在寫任何邏輯功能時,發現跑出來的速度不是想像的這麼快,或者是在串接服務流程時,整個回覆時間特別久,這時候可以透過 benchmark 先找出原因。

1
go test -bench=. -benchtime=3s ./lexer/
[Read More]

用 10 分鐘了解 Go 語言 context package 使用場景及介紹

golang logo

context 是在 Go 語言 1.7 版才正式被納入官方標準庫內,為什麼今天要介紹 context 使用方式呢?原因很簡單,在初學 Go 時,寫 API 時,常常不時就會看到在 http handler 的第一個參數就會是 ctx context.Context,而這個 context 在這邊使用的目的及含義到底是什麼呢,本篇就是帶大家了解什麼是 context,以及使用的場景及方式,內容不會提到 context 的原始碼,而是用幾個實際例子來了解。

[Read More]

使用 Docker BuildKit 加速編譯 Image

docker buildkit

程式碼範例請看這邊

之前就有看到 Docker 推出 BuildKit 功能,這次跟大家介紹什麼是 BuildKit。現在部署編譯流程肯定都會用到 Docker,不管測試及部署都盡量在 Docker 內實現,來做到環境隔離,但是要怎麼縮短 Docker 在編譯 Image 時間,這又是另外的議題,本篇跟大家介紹一個實驗性的功能就是 BuildKit,原始碼可以參考這邊,希望未來這實驗性的功能可以正式納入 Docker 官方,網路上其實可以找到很多方式來做 Docker Layer 的 Cache,我個人最常用的就是 --cache-from 機制,可以適用在任何 CI/CD 流程,詳細說明可以參考這篇『在 docker-in-docker 環境中使用 cache-from 提升編譯速度』,下面使用到的程式碼都可以直接參考此 Repository,我還是使用 Go 語言當作參考範例。

[Read More]

[Go 語言] 從 graphql-go 轉換到 gqlgen

golang logo

相信各位開發者對於 GraphQL 帶來的好處已經非常清楚,如果對 GraphQL 很陌生的朋友們,可以直接參考之前作者寫的一篇『Go 語言實戰 GraphQL』,內容會講到用 Go 語言實戰 GraphQL 架構,教開發者如何撰寫 GraphQL 測試及一些開發小技巧,不過內容都是以 graphql-go 框架為主。而本篇主題會講為什麼我從 graphql-go 框架轉換到 gqlgen

[Read More]