mirror of
https://github.com/dashpay/dash.git
synced 2024-12-26 12:32:48 +01:00
Merge #16957: 9% less memory: make SaltedOutpointHasher noexcept
67d99900b0d770038c9c5708553143137b124a6c make SaltedOutpointHasher noexcept (Martin Ankerl)
Pull request description:
If the hash is not `noexcept`, `unorderd_map` has to assume that it can throw an exception. Thus when rehashing care needs to be taken. libstdc++ solves this by simply caching the hash value, which increases memory of each node by 8 bytes. Adding `noexcept` prevents this caching. In my experiments with `-reindex-chainstate -stopatheight=594000`, memory usage (maximum resident set size) has decreased by 9.4% while runtime has increased by 1.6% due to additional hashing. Additionally, memusage::DynamicUsage() is now more accurate and does not underestimate.
| | runtime h:mm:ss | max RSS kbyte |
|---------------------------------------|-----------------|--------------|
| master | 4:13:59 | 7696728 |
| 2019-09-SaltedOutpointHasher-noexcept | 4:18:11 | 6971412 |
| change | +1.65% | -9,42% |
Comparison of progress masters vs. 2019-09-SaltedOutpointHasher-noexcept
![out](https://user-images.githubusercontent.com/14386/65541887-69424e00-df0e-11e9-8644-b3a068ed8c3f.png)
ACKs for top commit:
jamesob:
Tested ACK 67d99900b0
Tree-SHA512: 9c44e3cca993b5a564dd61ebd2926b9c4a238609ea4d283514c018236f977d935e35a384dd4696486fd3d78781dd2ba190bb72596e20a5e931042fa465872a0b
This commit is contained in:
parent
a597c1bb8e
commit
bca013ddd6
10
src/coins.h
10
src/coins.h
@ -94,8 +94,16 @@ public:
|
|||||||
* This *must* return size_t. With Boost 1.46 on 32-bit systems the
|
* This *must* return size_t. With Boost 1.46 on 32-bit systems the
|
||||||
* unordered_map will behave unpredictably if the custom hasher returns a
|
* unordered_map will behave unpredictably if the custom hasher returns a
|
||||||
* uint64_t, resulting in failures when syncing the chain (#4634).
|
* uint64_t, resulting in failures when syncing the chain (#4634).
|
||||||
|
*
|
||||||
|
* Having the hash noexcept allows libstdc++'s unordered_map to recalculate
|
||||||
|
* the hash during rehash, so it does not have to cache the value. This
|
||||||
|
* reduces node's memory by sizeof(size_t). The required recalculation has
|
||||||
|
* a slight performance penalty (around 1.6%), but this is compensated by
|
||||||
|
* memory savings of about 9% which allow for a larger dbcache setting.
|
||||||
|
*
|
||||||
|
* @see https://gcc.gnu.org/onlinedocs/gcc-9.2.0/libstdc++/manual/manual/unordered_associative.html
|
||||||
*/
|
*/
|
||||||
size_t operator()(const COutPoint& id) const {
|
size_t operator()(const COutPoint& id) const noexcept {
|
||||||
return SipHashUint256Extra(k0, k1, id.hash, id.n);
|
return SipHashUint256Extra(k0, k1, id.hash, id.n);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user