Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[R4R] performance improvement in many aspects #257

Merged
merged 10 commits into from
Jul 29, 2021
Merged

[R4R] performance improvement in many aspects #257

merged 10 commits into from
Jul 29, 2021

Commits on Jul 12, 2021

  1. focus on performance improvement in many aspects.

    1. Do BlockBody verification concurrently;
    2. Do calculation of intermediate root concurrently;
    3. Preload accounts before processing blocks;
    4. Make the snapshot layers configurable.
    5. Reuse some object to reduce GC.
    
    add
    unclezoro committed Jul 12, 2021
    Configuration menu
    Copy the full SHA
    0f10448 View commit details
    Browse the repository at this point in the history
  2. rlp: improve decoder stream implementation (#22858)

    This commit makes various cleanup changes to rlp.Stream.
    
    * rlp: shrink Stream struct
    
    This removes a lot of unused padding space in Stream by reordering the
    fields. The size of Stream changes from 120 bytes to 88 bytes. Stream
    instances are internally cached and reused using sync.Pool, so this does
    not improve performance.
    
    * rlp: simplify list stack
    
    The list stack kept track of the size of the current list context as
    well as the current offset into it. The size had to be stored in the
    stack in order to subtract it from the remaining bytes of any enclosing
    list in ListEnd. It seems that this can be implemented in a simpler
    way: just subtract the size from the enclosing list context in List instead.
    fjl authored and unclezoro committed Jul 12, 2021
    Configuration menu
    Copy the full SHA
    17cb4da View commit details
    Browse the repository at this point in the history
  3. rlp: use atomic.Value for type cache (#22902)

    All encoding/decoding operations read the type cache to find the
    writer/decoder function responsible for a type. When analyzing CPU
    profiles of geth during sync, I found that the use of sync.RWMutex in
    cache lookups appears in the profiles. It seems we are running into
    CPU cache contention problems when package rlp is heavily used
    on all CPU cores during sync.
    
    This change makes it use atomic.Value + a writer lock instead of
    sync.RWMutex. In the common case where the typeinfo entry is present in
    the cache, we simply fetch the map and lookup the type.
    fjl authored and unclezoro committed Jul 12, 2021
    Configuration menu
    Copy the full SHA
    55127dc View commit details
    Browse the repository at this point in the history
  4. rlp: optimize byte array handling (#22924)

    This change improves the performance of encoding/decoding [N]byte.
    
        name                     old time/op    new time/op    delta
        DecodeByteArrayStruct-8     336ns ± 0%     246ns ± 0%  -26.98%  (p=0.000 n=9+10)
        EncodeByteArrayStruct-8     225ns ± 1%     148ns ± 1%  -34.12%  (p=0.000 n=10+10)
    
        name                     old alloc/op   new alloc/op   delta
        DecodeByteArrayStruct-8      120B ± 0%       48B ± 0%  -60.00%  (p=0.000 n=10+10)
        EncodeByteArrayStruct-8     0.00B          0.00B          ~     (all equal)
    fjl authored and unclezoro committed Jul 12, 2021
    Configuration menu
    Copy the full SHA
    31c452b View commit details
    Browse the repository at this point in the history
  5. rlp: optimize big.Int decoding for size <= 32 bytes (#22927)

    This change grows the static integer buffer in Stream to 32 bytes,
    making it possible to decode 256bit integers without allocating a
    temporary buffer.
    
    In the recent commit 088da24, Stream struct size decreased from 120
    bytes down to 88 bytes. This commit grows the struct to 112 bytes again,
    but the size change will not degrade performance because Stream
    instances are internally cached in sync.Pool.
    
        name             old time/op    new time/op    delta
        DecodeBigInts-8    12.2µs ± 0%     8.6µs ± 4%  -29.58%  (p=0.000 n=9+10)
    
        name             old speed      new speed      delta
        DecodeBigInts-8   230MB/s ± 0%   326MB/s ± 4%  +42.04%  (p=0.000 n=9+10)
    fjl authored and unclezoro committed Jul 12, 2021
    Configuration menu
    Copy the full SHA
    9ff2ab5 View commit details
    Browse the repository at this point in the history
  6. eth/protocols/eth, les: avoid Raw() when decoding HashOrNumber (#22841)

    Getting the raw value is not necessary to decode this type, and
    decoding it directly from the stream is faster.
    fjl authored and unclezoro committed Jul 12, 2021
    Configuration menu
    Copy the full SHA
    bbd2148 View commit details
    Browse the repository at this point in the history

Commits on Jul 14, 2021

  1. fix testcase

    unclezoro committed Jul 14, 2021
    Configuration menu
    Copy the full SHA
    5427bde View commit details
    Browse the repository at this point in the history
  2. debug no lazy

    unclezoro committed Jul 14, 2021
    Configuration menu
    Copy the full SHA
    90863ac View commit details
    Browse the repository at this point in the history

Commits on Jul 20, 2021

  1. fix can not repair

    unclezoro committed Jul 20, 2021
    Configuration menu
    Copy the full SHA
    94e1505 View commit details
    Browse the repository at this point in the history

Commits on Jul 22, 2021

  1. address comments

    unclezoro committed Jul 22, 2021
    Configuration menu
    Copy the full SHA
    8975587 View commit details
    Browse the repository at this point in the history