feat(ccc): reuse a buffer for json encoding (#855)

Co-authored-by: Ömer Faruk Irmak <omerfirmak@gmail.com>
This commit is contained in:
HAOYUatHZ 2024-06-25 20:18:47 +08:00 committed by GitHub
parent 459324c41d
commit a19bdff959
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -10,6 +10,7 @@ package circuitcapacitychecker
import "C" //nolint:typecheck import "C" //nolint:typecheck
import ( import (
"bytes"
"encoding/json" "encoding/json"
"fmt" "fmt"
"sync" "sync"
@ -29,7 +30,8 @@ func init() {
type CircuitCapacityChecker struct { type CircuitCapacityChecker struct {
// mutex for each CircuitCapacityChecker itself // mutex for each CircuitCapacityChecker itself
sync.Mutex sync.Mutex
ID uint64 ID uint64
jsonBuffer bytes.Buffer
} }
// NewCircuitCapacityChecker creates a new CircuitCapacityChecker // NewCircuitCapacityChecker creates a new CircuitCapacityChecker
@ -65,13 +67,14 @@ func (ccc *CircuitCapacityChecker) ApplyTransaction(traces *types.BlockTrace) (*
return nil, ErrUnknown return nil, ErrUnknown
} }
tracesByt, err := json.Marshal(traces) ccc.jsonBuffer.Reset()
err := json.NewEncoder(&ccc.jsonBuffer).Encode(traces)
if err != nil { if err != nil {
log.Error("fail to json marshal traces in ApplyTransaction", "id", ccc.ID, "TxHash", traces.Transactions[0].TxHash, "err", err) log.Error("fail to json marshal traces in ApplyTransaction", "id", ccc.ID, "TxHash", traces.Transactions[0].TxHash, "err", err)
return nil, ErrUnknown return nil, ErrUnknown
} }
tracesStr := C.CString(string(tracesByt)) tracesStr := C.CString(string(ccc.jsonBuffer.Bytes()))
defer func() { defer func() {
C.free(unsafe.Pointer(tracesStr)) C.free(unsafe.Pointer(tracesStr))
}() }()
@ -111,13 +114,14 @@ func (ccc *CircuitCapacityChecker) ApplyBlock(traces *types.BlockTrace) (*types.
ccc.Lock() ccc.Lock()
defer ccc.Unlock() defer ccc.Unlock()
tracesByt, err := json.Marshal(traces) ccc.jsonBuffer.Reset()
err := json.NewEncoder(&ccc.jsonBuffer).Encode(traces)
if err != nil { if err != nil {
log.Error("fail to json marshal traces in ApplyBlock", "id", ccc.ID, "blockNumber", traces.Header.Number, "blockHash", traces.Header.Hash(), "err", err) log.Error("fail to json marshal traces in ApplyBlock", "id", ccc.ID, "blockNumber", traces.Header.Number, "blockHash", traces.Header.Hash(), "err", err)
return nil, ErrUnknown return nil, ErrUnknown
} }
tracesStr := C.CString(string(tracesByt)) tracesStr := C.CString(string(ccc.jsonBuffer.Bytes()))
defer func() { defer func() {
C.free(unsafe.Pointer(tracesStr)) C.free(unsafe.Pointer(tracesStr))
}() }()