Skip to content
Merged
3 changes: 1 addition & 2 deletions core/txpool/legacypool/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,13 +160,12 @@ func (m *sortedMap) Cap(threshold int) types.Transactions {
// Otherwise gather and drop the highest nonce'd transactions
var drops types.Transactions

sort.Sort(*m.index)
sort.Sort(*m.index) // the sorted array is a heap, so no need to reheap after deleting tail items
for size := len(m.items); size > threshold; size-- {
drops = append(drops, m.items[(*m.index)[size-1]])
delete(m.items, (*m.index)[size-1])
}
*m.index = (*m.index)[:threshold]
heap.Init(m.index)

// If we had a cache, shift the back
m.cacheMu.Lock()
Expand Down
22 changes: 22 additions & 0 deletions core/txpool/legacypool/list_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,3 +70,25 @@ func BenchmarkListAdd(b *testing.B) {
}
}
}

func BenchmarkListCapOneTx(b *testing.B) {
// Generate a list of transactions to insert
key, _ := crypto.GenerateKey()

txs := make(types.Transactions, 32)
for i := 0; i < len(txs); i++ {
txs[i] = transaction(uint64(i), 0, key)
}

b.ResetTimer()
for i := 0; i < b.N; i++ {
list := newList(true)
// Insert the transactions in a random order
for _, v := range rand.Perm(len(txs)) {
list.Add(txs[v], DefaultConfig.PriceBump)
}
b.StartTimer()
list.Cap(list.Len() - 1)
b.StopTimer()
}
}