Branch: refs/heads/master
  Home:   https://github.com/btcsuite/btcd
  Commit: 3b39edcaa1e867efc4223d95ca1496aaadf8eca3
      
https://github.com/btcsuite/btcd/commit/3b39edcaa1e867efc4223d95ca1496aaadf8eca3
  Author: Olaoluwa Osuntokun <laol...@gmail.com>
  Date:   2016-04-13 (Wed, 13 Apr 2016)

  Changed paths:
    M btcec/pubkey.go
    M btcec/pubkey_test.go
    M btcec/signature.go
    M btcec/signature_test.go
    M config.go
    M txscript/reference_test.go
    M txscript/sigcache.go

  Log Message:
  -----------
  txscript: optimize sigcache lookup (#598)

Profiles discovered that lookups into the signature cache included an
expensive comparison to the stored `sigInfo` struct. This lookup had the
potential to be more expensive than directly verifying the signature
itself!

In addition, evictions were rather expensive because they involved
reading from /dev/urandom, or equivalent, for each eviction once the
signature cache was full as well as potentially iterating over every
item in the cache in the worst-case.

To remedy this poor performance several changes have been made:
* Change the lookup key to the fixed sized 32-byte signature hash
* Perform a full equality check only if there is a cache hit which
    results in a significant  speed up for both insertions and existence
checks
* Override entries in the case of a colliding hash on insert Add an
* .IsEqual() method to the Signature and PublicKey types in the
  btcec package to facilitate easy equivalence testing
* Allocate the signature cache map with the max number of entries in
  order to avoid unnecessary map re-sizes/allocations
* Optimize evictions from the signature cache Delete the first entry
* seen which is safe from manipulation due to
    the pre image resistance of the hash function
* Double the default maximum number of entries within the signature
  cache due to the reduction in the size of a cache entry
  * With this eviction scheme, removals are effectively O(1)

Fixes #575.


Reply via email to