Percepat API Anda
Membuat objek baru bisa menjadi operasi yang relatif mahal, terutama jika melibatkan pengalokasian memori di heap, jadi menggunakan kembali objek dapat membantu mengurangi biaya overhead dan meningkatkan performa. Dengan menyimpan kumpulan objek yang telah dialokasikan sebelumnya dan menggunakannya kembali sesuai kebutuhan, kita dapat menghindari overhead pengalokasian dan deAlokasi memori (pengumpul sampah membatalkan alokasi variabel yang tidak digunakan dalam memori).
Ini bisa sangat berguna untuk API yang perlu menangani sejumlah besar permintaan, di mana pembuatan dan penghancuran objek pada setiap permintaan bisa menjadi hambatan yang signifikan. Dengan menggunakan kembali objek, kita dapat mengurangi jumlah waktu dan memori CPU yang diperlukan, yang dapat menghasilkan kinerja yang lebih baik dan kemampuan untuk menangani lebih banyak permintaan.
Untuk mencapai ini, kita bisa menggunakan sync.Poolpaket di Go untuk mengimplementasikan penggabungan objek. Itu sync.Pooladalah paket Go bawaan yang menyediakan mekanisme thread-safe untuk menyimpan dan mengambil objek dari kumpulan.
Bisa langsung loncat kode..!!
Penangan:-
package handlers
import (
"encoding/json"
"net/http"
"sync"
)
type Request struct {
Name string `json:"name"`
Id string `json:"id"`
Country string `json:"country"`
Age int `json:"age"`
}
type ObjectPool struct {
ReqPool *sync.Pool
}
var objPool ObjectPool
func init() {
// init object pool
objPool.ReqPool = &sync.Pool{
New: func() interface{} {
return new(Request)
},
}
}
func HandlerWithoutSyncPool() http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
req :=new(Request)
err := json.NewDecoder(r.Body).Decode(&req)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
w.WriteHeader(http.StatusOK)
err = json.NewEncoder(w).Encode(req)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
return
}
})
}
func HandlerWithSyncPool() http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
req := objPool.ReqPool.Get().(*Request)
//to make sure it return object to pool
defer objPool.ReqPool.Put(req)
err := json.NewDecoder(r.Body).Decode(&req)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
w.WriteHeader(http.StatusOK)
})
}
Catatan: -hasil bervariasi dengan jenis objek yang kami kumpulkan
package handlers
import (
"bytes"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
)
var tests = []struct {
req Request
}{
{
req: Request{Name: "test", Country: "testCountry", Id: "id1", Age: 10},
},
}
func BenchmarkHandlerWithSyncPool(b *testing.B) {
for _, test := range tests {
data, _ := json.Marshal(test)
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
_, _ = http.Post("http://127.0.0.1:8888/withpool", "application/json", bytes.NewBuffer(data))
}
})
}
}
func BenchmarkHandlerWithoutSyncPool(b *testing.B) {
for _, test := range tests {
data, _ := json.Marshal(test)
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
_, _ = http.Post("http://127.0.0.1:8888/withoutpool", "application/json", bytes.NewBuffer(data))
}
})
}
}
go test -bench=BenchmarkHandlerWithoutSyncPool -benchtime=5s -cpu=1
goos: darwin
goarch: amd64
pkg: testsyncpool/handlers
cpu: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
BenchmarkHandlerWithoutSyncPool 23067 1004690 ns/op
go test -bench=BenchmarkHandlerWithSyncPool -benchtime=5s -cpu=1
goos: darwin
goarch: amd64
pkg: testsyncpool/handlers
cpu: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
BenchmarkHandlerWithSyncPool 77290 76521 ns/op
package main
import (
"log"
"net/http"
"net/http/pprof"
"testsyncpool/handlers"
)
func main() {
r := http.NewServeMux()
//r.Handle("/withoutpool", handlers.HandlerWithoutSyncPool())
r.Handle("/withpool", handlers.HandlerWithSyncPool())
// Register pprof handlers
r.HandleFunc("/debug/pprof/", pprof.Index)
r.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
r.HandleFunc("/debug/pprof/profile", pprof.Profile)
r.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
r.HandleFunc("/debug/pprof/trace", pprof.Trace)
err := http.ListenAndServe(":8888", r)
if err != nil {
log.Fatal(err)
}
}
Silakan menambahkan komentar / saran / kesalahan dll…

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































