]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Minimize allocations due to heap escapes
authorMatt Joiner <anacrolix@gmail.com>
Thu, 9 Dec 2021 10:49:29 +0000 (21:49 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Sun, 12 Dec 2021 07:35:01 +0000 (18:35 +1100)
request-strategy/order.go
request-strategy/piece-request-order.go

index f414226da0700a906cacee99560784eabc9f9f71..4068ed4dd80aa9e70b193e01bb7b2e2a90036330 100644 (file)
@@ -81,7 +81,7 @@ func GetRequestablePieces(input Input, pro *PieceRequestOrder, f func(ih metainf
        }
        var allTorrentsUnverifiedBytes int64
        pro.tree.Ascend(func(i btree.Item) bool {
-               _i := i.(pieceRequestOrderItem)
+               _i := i.(*pieceRequestOrderItem)
                ih := _i.key.InfoHash
                var t Torrent = input.Torrent(ih)
                var piece Piece = t.Piece(_i.key.Index)
index e0af7487559c90c44cbfc56041cd798e8a5bd334..0b1d6b4e01f9d5b776a0a75e39483f4ab549ffa1 100644 (file)
@@ -35,8 +35,8 @@ type pieceRequestOrderItem struct {
        state PieceRequestOrderState
 }
 
-func (me pieceRequestOrderItem) Less(other btree.Item) bool {
-       otherConcrete := other.(pieceRequestOrderItem)
+func (me *pieceRequestOrderItem) Less(other btree.Item) bool {
+       otherConcrete := other.(*pieceRequestOrderItem)
        return pieceOrderLess(
                pieceOrderInput{
                        PieceRequestOrderState: me.state,
@@ -53,7 +53,7 @@ func (me *PieceRequestOrder) Add(key PieceRequestOrderKey, state PieceRequestOrd
        if _, ok := me.keys[key]; ok {
                panic(key)
        }
-       if me.tree.ReplaceOrInsert(pieceRequestOrderItem{
+       if me.tree.ReplaceOrInsert(&pieceRequestOrderItem{
                key:   key,
                state: state,
        }) != nil {
@@ -63,13 +63,15 @@ func (me *PieceRequestOrder) Add(key PieceRequestOrderKey, state PieceRequestOrd
 }
 
 func (me *PieceRequestOrder) Update(key PieceRequestOrderKey, state PieceRequestOrderState) {
-       if me.tree.Delete(me.existingItemForKey(key)) == nil {
+       item := me.existingItemForKey(key)
+       if item.state == state {
+               return
+       }
+       if me.tree.Delete(&item) == nil {
                panic(fmt.Sprintf("%#v", key))
        }
-       if me.tree.ReplaceOrInsert(pieceRequestOrderItem{
-               key:   key,
-               state: state,
-       }) != nil {
+       item.state = state
+       if me.tree.ReplaceOrInsert(&item) != nil {
                panic(key)
        }
        me.keys[key] = state
@@ -83,7 +85,8 @@ func (me *PieceRequestOrder) existingItemForKey(key PieceRequestOrderKey) pieceR
 }
 
 func (me *PieceRequestOrder) Delete(key PieceRequestOrderKey) {
-       if me.tree.Delete(me.existingItemForKey(key)) == nil {
+       item := me.existingItemForKey(key)
+       if me.tree.Delete(&item) == nil {
                panic(key)
        }
        delete(me.keys, key)