From 17ea4f7fdd2b73bc32e855d4670bbeacdda5c713 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Sat, 23 Sep 2017 15:28:13 +1000 Subject: [PATCH] Performance optimizations to calculating bytes left in Torrent Was generating significant overhead in cmd/torrent --- metainfo/info.go | 3 --- piece.go | 10 +++++----- torrent.go | 23 +++++++++++------------ 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/metainfo/info.go b/metainfo/info.go index 7fbc88e9..a7e23a7f 100644 --- a/metainfo/info.go +++ b/metainfo/info.go @@ -126,9 +126,6 @@ func (info *Info) TotalLength() (ret int64) { } func (info *Info) NumPieces() int { - if len(info.Pieces)%20 != 0 { - panic(len(info.Pieces)) - } return len(info.Pieces) / 20 } diff --git a/piece.go b/piece.go index 7a0c2f17..e09e00c8 100644 --- a/piece.go +++ b/piece.go @@ -128,11 +128,11 @@ func (p *Piece) chunkIndexSpec(chunk int) chunkSpec { } func (p *Piece) numDirtyBytes() (ret pp.Integer) { - defer func() { - if ret > p.length() { - panic("too many dirty bytes") - } - }() + // defer func() { + // if ret > p.length() { + // panic("too many dirty bytes") + // } + // }() numRegularDirtyChunks := p.numDirtyChunks() if p.chunkIndexDirty(p.numChunks() - 1) { numRegularDirtyChunks-- diff --git a/torrent.go b/torrent.go index 84691af6..3374778b 100644 --- a/torrent.go +++ b/torrent.go @@ -558,9 +558,11 @@ func (t *Torrent) bytesMissingLocked() int64 { } func (t *Torrent) bytesLeft() (left int64) { - for i := 0; i < t.numPieces(); i++ { - left += int64(t.pieces[i].bytesLeft()) - } + bitmap.Flip(t.completedPieces, 0, t.numPieces()).IterTyped(func(piece int) bool { + p := t.pieces[piece] + left += int64(p.length() - p.numDirtyBytes()) + return true + }) return } @@ -658,17 +660,14 @@ type Peer struct { SupportsEncryption bool } -func (t *Torrent) pieceLength(piece int) (len_ pp.Integer) { - if piece < 0 || piece >= t.info.NumPieces() { - return - } +func (t *Torrent) pieceLength(piece int) pp.Integer { if piece == t.numPieces()-1 { - len_ = pp.Integer(t.length % t.info.PieceLength) + ret := pp.Integer(t.length % t.info.PieceLength) + if ret != 0 { + return ret + } } - if len_ == 0 { - len_ = pp.Integer(t.info.PieceLength) - } - return + return pp.Integer(t.info.PieceLength) } func (t *Torrent) hashPiece(piece int) (ret metainfo.Hash) {