avoid copy the whole slice

This commit is contained in:
maskpp 2024-06-29 21:59:47 +08:00
parent c1579c907f
commit 20f6b7a854

View file

@ -56,7 +56,7 @@ type payloadQueue struct {
// all containing empty items. // all containing empty items.
func newPayloadQueue() *payloadQueue { func newPayloadQueue() *payloadQueue {
return &payloadQueue{ return &payloadQueue{
payloads: make([]*payloadQueueItem, maxTrackedPayloads), payloads: make([]*payloadQueueItem, 0, maxTrackedPayloads),
} }
} }
@ -65,10 +65,12 @@ func (q *payloadQueue) put(id engine.PayloadID, payload *miner.Payload) {
q.lock.Lock() q.lock.Lock()
defer q.lock.Unlock() defer q.lock.Unlock()
copy(q.payloads[1:], q.payloads) q.payloads = append(q.payloads, &payloadQueueItem{
q.payloads[0] = &payloadQueueItem{
id: id, id: id,
payload: payload, payload: payload,
})
if len(q.payloads) > maxTrackedPayloads {
q.payloads = q.payloads[1:]
} }
} }
@ -78,9 +80,6 @@ func (q *payloadQueue) get(id engine.PayloadID, full bool) *engine.ExecutionPayl
defer q.lock.RUnlock() defer q.lock.RUnlock()
for _, item := range q.payloads { for _, item := range q.payloads {
if item == nil {
return nil // no more items
}
if item.id == id { if item.id == id {
if !full { if !full {
return item.payload.Resolve() return item.payload.Resolve()
@ -97,9 +96,6 @@ func (q *payloadQueue) has(id engine.PayloadID) bool {
defer q.lock.RUnlock() defer q.lock.RUnlock()
for _, item := range q.payloads { for _, item := range q.payloads {
if item == nil {
return false
}
if item.id == id { if item.id == id {
return true return true
} }
@ -125,7 +121,7 @@ type headerQueue struct {
// all containing empty items. // all containing empty items.
func newHeaderQueue() *headerQueue { func newHeaderQueue() *headerQueue {
return &headerQueue{ return &headerQueue{
headers: make([]*headerQueueItem, maxTrackedHeaders), headers: make([]*headerQueueItem, 0, maxTrackedHeaders),
} }
} }
@ -138,7 +134,9 @@ func (q *headerQueue) put(hash common.Hash, data *types.Header) {
hash: hash, hash: hash,
header: data, header: data,
}) })
q.headers = q.headers[1:] if len(q.headers) > maxTrackedHeaders {
q.headers = q.headers[1:]
}
} }
// get retrieves a previously stored header item or nil if it does not exist. // get retrieves a previously stored header item or nil if it does not exist.
@ -146,11 +144,7 @@ func (q *headerQueue) get(hash common.Hash) *types.Header {
q.lock.RLock() q.lock.RLock()
defer q.lock.RUnlock() defer q.lock.RUnlock()
for i := len(q.headers) - 1; i >= 0; i-- { for _, item := range q.headers {
item := q.headers[i]
if item == nil {
return nil // no more items
}
if item.hash == hash { if item.hash == hash {
return item.header return item.header
} }