Skip to content

EVM Optimisations - Improves 70% of EEST benchmarks#9775

Merged
siladu merged 17 commits intohyperledger:mainfrom
siladu:evm-fast-paths
Feb 16, 2026
Merged

EVM Optimisations - Improves 70% of EEST benchmarks#9775
siladu merged 17 commits intohyperledger:mainfrom
siladu:evm-fast-paths

Conversation

@siladu
Copy link
Contributor

@siladu siladu commented Feb 10, 2026

Optimisations found while profiling REVERT benchmark:
https://github.com/ethereum/execution-specs/blob/forks/amsterdam/tests/benchmark/compute/instruction/test_system.py
https://github.com/ethereum/execution-spec-tests/releases/tag/benchmark%40v0.0.7

These are all minimally-invasive fast path optimisations:

  • AbstractMessageProcessor.clearAccumulatedStateBesidesGasAndOutput - use java 7-style loop instead of Stream API
  • AbstractMessageProcessor.clearAccumulatedStateBesidesGasAndOutput - revert fast path when touched accounts are empty
  • MessageFrame.build - Skip redundant warmUpAddress for contract
  • AbstractCallOperation.complete - Skip empty collection adds
  • StackedUpdater.getTouchedAccounts - Returns emptyList when no updates exist, avoiding ArrayList allocation for empty STATICCALL frames

Benchmarks

On m6a.2xlarge, ran 5 rounds of:

evmtool --repeat 10 block-test ~/2026-02-09_fixtures_benchmark_v0.0.7/blockchain_tests/benchmark/compute/*/*/* --test-name 100M > block-test-control-bf64be2_100M_1.log

versus

./build/install/besu/bin/evmtool --repeat 10 block-test ~/2026-02-09_fixtures_benchmark_v0.0.7/blockchain_tests/benchmark/compute/*/*/* --test-name 100M > block-test-evm-fast-paths_100M_1.log

Analysis:

python3 ../compare_benchmarks.py --control *control* --opt *evm-fast-paths* --output 2026-02-13_benchmark-comparison_evm-fast-paths.md
  • Tests compared: 940
  • Anomaly threshold: CV > 15.0%
  • Anomalous tests: 293 (31.2%)

Values shown are the mean across rounds.

Metric All Tests Stable Only (excl. anomalies)
Total 940 647
Improvements (>1%) 662 (70.4%) 379 (58.6%)
Regressions (<-1%) 90 (9.6%) 81 (12.5%)
Neutral (-1% to +1%) 188 (20.0%) 187 (28.9%)
Mean change +6.46% +3.28%
Median change +6.08% +1.80%

Slow test reports - where OPCODEs improved/regressed wrt 60MGas/s

python3 ../slow_tests_report.py --files *evm-fast-paths*.log --control *control*.log --output 2026-02-13_slow-tests_evm-fast-paths-60MGasps.md --threshold 60

  Threshold: 60.0 MGas/s
  Control slow: 46  |  Test slow: 45  |  Net: +1
  Escaped: 2  |  Still slow: 44  |  Newly slow: 1

  Escaped by opcode:
    SHL                         1 tests  (+5.42%)
    SHR                         1 tests  (+5.71%)

  Newly slow by opcode:
    ADD                         1 tests  (-2.79%)

Escaped Tests (2 tests now above 60.0 MGas/s)

By Opcode
Opcode Count Ctrl Range Test Range Mean Change
SHL 1 58.56-58.56 61.74-61.74 +5.42%
SHR 1 57.02-57.02 60.28-60.28 +5.71%
All Escaped Tests
Ctrl Mean Test Mean Change Opcode Test
57.02 60.28 +5.71% SHR test_bitwise[opcode_SHR- @ 100M
58.56 61.74 +5.42% SHL test_bitwise[opcode_SHL- @ 100M

Newly Slow Tests (1 tests now below 60.0 MGas/s)

By Opcode
Opcode Count Ctrl Range Test Range Mean Change
ADD 1 60.21-60.21 58.53-58.53 -2.79%
All Newly Slow Tests
Ctrl Mean Test Mean Change Opcode Test
60.21 58.53 -2.79% ADD test_arithmetic[opcode_ADD- @ 100M

Still Slow Tests (44 tests still below 60.0 MGas/s)

Summary by Opcode
Opcode Count Min MGas/s Max MGas/s Mean Change
MULMOD 4 29.02 35.01 +0.53%
SDIV 2 30.52 30.66 -0.47%
EQ 1 32.26 32.26 +3.15%
SMOD 4 33.42 42.09 +3.49%
MOD 5 34.33 52.50 +5.27%
SAR 2 37.28 44.70 +3.86%
POINT_EVALUATION 1 38.88 38.88 +0.29%
SUB 1 39.07 39.07 -1.87%
MUL 1 42.88 42.88 +3.39%
DIV 2 43.20 44.22 +5.09%
ADDMOD 4 46.06 55.98 +2.84%
KECCAK_MAX_PERMUTATIONS 1 53.78 53.78 +0.06%
KECCAK 3 54.92 55.14 +1.43%
KECCAK_DIFF_MEM_MSG_SIZES 8 57.03 58.29 +0.94%
REVERT 1 59.30 59.30 +10.27%
BLAKE2F 4 59.68 59.82 +1.45%

This PR helps with higher gas limits too:

100MGas/s

python3 ../slow_tests_report.py --files *evm-fast-paths*.log --control *control*.log --output 2026-02-13_slow-tests_evm-fast-paths-100MGasps.md --threshold 100

  Threshold: 100.0 MGas/s
  Control slow: 208  |  Test slow: 168  |  Net: +40
  Escaped: 40  |  Still slow: 168  |  Newly slow: 0

  Escaped by opcode:
    CALLDATACOPY_FROM_CALL      1 tests  (+6.88%)
    GASLIMIT                    1 tests  (+14.31%)
    GAS_OP                      1 tests  (+14.01%)
    MSIZE                       3 tests  (+13.58%)
    MSTORE                     30 tests  (+8.60%)
    NUMBER                      1 tests  (+14.11%)
    RETURNDATASIZE_ZERO         1 tests  (+13.77%)
    REVERT                      1 tests  (+9.12%)
    TIMESTAMP                   1 tests  (+13.76%)

180MGas/s

python3 ../slow_tests_report.py --files *evm-fast-paths*.log --control *control*.log --output 2026-02-13_slow-tests_evm-fast-paths-180MGasps.md --threshold 180

  Threshold: 180.0 MGas/s
  Control slow: 458  |  Test slow: 435  |  Net: +23
  Escaped: 23  |  Still slow: 435  |  Newly slow: 0

  Escaped by opcode:
    ALT_BN128                   2 tests  (+0.14%)
    CALLVALUE_FROM_ORIGIN       2 tests  (+25.83%)
    JUMPDESTS                   1 tests  (+47.10%)
    PUSH0                       1 tests  (+23.52%)
    PUSH6                       1 tests  (+11.94%)
    SWAP1                       1 tests  (+10.12%)
    SWAP10                      1 tests  (+10.55%)
    SWAP11                      1 tests  (+10.63%)
    SWAP12                      1 tests  (+10.33%)
    SWAP13                      1 tests  (+9.64%)
    SWAP14                      1 tests  (+10.11%)
    SWAP15                      1 tests  (+10.02%)
    SWAP16                      1 tests  (+10.23%)
    SWAP2                       1 tests  (+10.10%)
    SWAP3                       1 tests  (+10.52%)
    SWAP4                       1 tests  (+10.29%)
    SWAP5                       1 tests  (+9.98%)
    SWAP6                       1 tests  (+10.29%)
    SWAP7                       1 tests  (+10.37%)
    SWAP8                       1 tests  (+10.93%)
    SWAP9                       1 tests  (+10.25%)

Files

2026-02-13_benchmark-comparison_evm-fast-paths.md
2026-02-13_slow-tests_evm-fast-paths-60MGasps.md
2026-02-13_slow-tests_evm-fast-paths-100MGasps.md
2026-02-13_slow-tests_evm-fast-paths-180MGasps.md
compare_benchmarks.py
slow_tests_report.py

Testing

  • Mainnet sync
  • Hoodi full sync
  • ARM benchmarks

When a child frame reverts with no touched accounts (common for
STATICCALL with empty REVERT), skip the stream/filter/collect
pipeline and go straight to revert+commit.

Profiler shows ~5.9% of CPU in the revert path:
- ConcurrentHashMap$Traverser.advance (from getTouchedAccounts)
- ConcurrentHashMap.clear (from revert)
- MessageFrame.clearGasRefund
Most of this work is wasted when collections are empty.

Signed-off-by: Simon Dudley <simon.dudley@consensys.net>
Signed-off-by: Simon Dudley <simon.dudley@consensys.net>
Signed-off-by: Simon Dudley <simon.dudley@consensys.net>
Signed-off-by: Simon Dudley <simon.dudley@consensys.net>
…when no updates exist, avoiding ArrayList allocation for empty STATICCALL frames

Signed-off-by: Simon Dudley <simon.dudley@consensys.net>
Signed-off-by: Simon Dudley <simon.dudley@consensys.net>
Copy link
Member

@lu-pinto lu-pinto left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At least we should check while creating the MessageFrame if we could preload it with the warmed up addresses instead of doing another null check.
Also investigate if we really need those isEmpty checks in AbstractCallOperation, like doing some bench runs solely without them

… Set

Signed-off-by: Luis Pinto <luis.pinto@consensys.net>
Signed-off-by: Simon Dudley <simon.dudley@consensys.net>
Signed-off-by: Simon Dudley <simon.dudley@consensys.net>
Signed-off-by: Simon Dudley <simon.dudley@consensys.net>
This is a bug as was left over from BytesTrieSet which had different semantics

Signed-off-by: Simon Dudley <simon.dudley@consensys.net>
Copy link
Member

@lu-pinto lu-pinto left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Copy link
Contributor

@ahamlat ahamlat left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@siladu siladu moved this to In Progress in Performance Feb 12, 2026
@siladu siladu moved this from In Progress to In Review in Performance Feb 12, 2026
@siladu siladu self-assigned this Feb 12, 2026
Copy link
Contributor

@matkt matkt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checked the updater part and it is ok . I don't see any issues

@siladu siladu changed the title EVM fast path Optimisations - Improves STATICCALL and REVERT benchmarks EVM fast path Optimisations - Improves 70% of EEST benchmarks Feb 12, 2026
@siladu
Copy link
Contributor Author

siladu commented Feb 13, 2026

ADD -2.79%

Confirmed this regression is noise with more targetted and better warmed up runs (on VM) and JMH (on Mac):

Before this PR:

Benchmark                               Mode  Cnt   Score   Error  Units
AddOperationBenchmark.executeOperation  avgt   15  37.448 ± 0.843  ns/op

This PR:

Benchmark                               Mode  Cnt   Score   Error  Units
AddOperationBenchmark.executeOperation  avgt   15  37.306 ± 0.823  ns/op

Also profiling analysis (on Mac):

JAVA_OPTS=-agentpath:~/tools/async-profiler-4.2.1-macos/lib/libasyncProfiler.dylib=start,event=cpu,file=bf64be2-control-ADD.coll ./build/install/besu/bin/evmtool --repeat 100 block-test ~/Documents/eest-benchmark-fixtures/2026-02-09_fixtures_benchmark_v0.0.7/blockchain_tests/benchmark/compute/instruction/arithmetic/arithmetic.json --test-name "*ADD-*100M*"
Profile Comparison: Control (bf64be2) vs Fast-paths (evm-fast-paths) — ADD workload

  Overview
  ┌───────────────┬─────────┬────────────┐
  │    Metric     │ Control │ Fast-paths │
  ├───────────────┼─────────┼────────────┤
  │ Total samples │ 5,596   │ 8,250      │
  ├───────────────┼─────────┼────────────┤
  │ Sample ratio  │ 1.0x    │ 1.47x      │
  └───────────────┴─────────┴────────────┘
  Since total samples differ, percentage share is the correct metric for comparison.

  Key Wins — Stack Manipulation Overhead Reduced
  ┌───────────────────────────────────────┬───────────┬──────────────┬─────────┐
  │                Method                 │ Control % │ Fast-paths % │ Change  │
  ├───────────────────────────────────────┼───────────┼──────────────┼─────────┤
  │ FlexStack.* (all)                     │ 14.49%    │ 9.08%        │ -5.41pp │
  ├───────────────────────────────────────┼───────────┼──────────────┼─────────┤
  │ FlexStack.pop                         │ 5.61%     │ 2.85%        │ -2.76pp │
  ├───────────────────────────────────────┼───────────┼──────────────┼─────────┤
  │ FlexStack.push                        │ 6.77%     │ 4.78%        │ -1.99pp │
  ├───────────────────────────────────────┼───────────┼──────────────┼─────────┤
  │ FlexStack.get                         │ 2.07%     │ 1.26%        │ -0.81pp │
  ├───────────────────────────────────────┼───────────┼──────────────┼─────────┤
  │ EVM.runToHalt                         │ 12.42%    │ 10.12%       │ -2.30pp │
  ├───────────────────────────────────────┼───────────┼──────────────┼─────────┤
  │ AddOperationOptimized.staticOperation │ 5.02%     │ 3.79%        │ -1.23pp │
  ├───────────────────────────────────────┼───────────┼──────────────┼─────────┤
  │ MessageFrame.popStackItem             │ 2.07%     │ 1.33%        │ -0.74pp │
  └───────────────────────────────────────┴───────────┴──────────────┴─────────┘
  The fast-path is successfully reducing stack manipulation overhead — FlexStack operations dropped 5.41pp collectively.

  Concerning — UInt256 byte conversions now dominate
  ┌──────────────────────────────────┬───────────┬──────────────┬──────────┐
  │              Method              │ Control % │ Fast-paths % │  Change  │
  ├──────────────────────────────────┼───────────┼──────────────┼──────────┤
  │ UInt256.* (all)                  │ 39.33%    │ 49.95%       │ +10.62pp │
  ├──────────────────────────────────┼───────────┼──────────────┼──────────┤
  │ UInt256.fromBytesBE              │ 12.76%    │ 17.53%       │ +4.77pp  │
  ├──────────────────────────────────┼───────────┼──────────────┼──────────┤
  │ UInt256.getIntBE                 │ 13.21%    │ 17.35%       │ +4.14pp  │
  ├──────────────────────────────────┼───────────┼──────────────┼──────────┤
  │ UInt256.toBytesBE                │ 0.98%     │ 2.00%        │ +1.02pp  │
  ├──────────────────────────────────┼───────────┼──────────────┼──────────┤
  │ UInt256.addWithCarry             │ 10.85%    │ 11.47%       │ +0.62pp  │
  ├──────────────────────────────────┼───────────┼──────────────┼──────────┤
  │ MessageFrame.setCurrentOperation │ 4.13%     │ 8.22%        │ +4.09pp  │
  └──────────────────────────────────┴───────────┴──────────────┴──────────┘
  With the stack overhead removed, UInt256.fromBytesBE/getIntBE/toBytesBE byte serialization is now the dominant bottleneck (~36% of the fast-paths profile).

  EVM vs Non-EVM
  ┌───────────────────────┬─────────┬────────────┐
  │       Category        │ Control │ Fast-paths │
  ├───────────────────────┼─────────┼────────────┤
  │ EVM-related           │ 80.81%  │ 84.93%     │
  ├───────────────────────┼─────────┼────────────┤
  │ Non-EVM (JIT, OS, GC) │ 16.19%  │ 13.33%     │
  └───────────────────────┴─────────┴────────────┘
  Interpretation

  1. Stack overhead successfully reduced — FlexStack ops down 5.41pp, confirming the fast-path bypasses MessageFrame.popStackItem -> FlexStack.pop for ADD.
  2. UInt256 byte conversion is the new bottleneck — fromBytesBE+getIntBE+toBytesBE went from 26.95% to 36.88%. These proportional increases likely reflect the removal of other overhead making these stand out more.
  3. MessageFrame.setCurrentOperation doubled (4.13% → 8.22%) — possibly because the main loop runs faster now, so more time is proportionally spent on per-iteration bookkeeping.
  4. Next optimization target: If the ADD fast-path could work with native long values directly (avoiding the bytes-to-int round-trip in UInt256), that could yield further gains.

Files

profile_compare.py
evm-fast-paths-ADD.coll.txt
bf64be2-control-ADD.coll.txt

@ahamlat
Copy link
Contributor

ahamlat commented Feb 13, 2026

Since total samples differ, percentage share is the correct metric for comparison.

Why are there more samples in the optimized version ? in general that indicates that the program takes more time to execute.

@siladu
Copy link
Contributor Author

siladu commented Feb 16, 2026

ARM results

On m8g.2xlarge, ran 5 rounds of:

evmtool --repeat 10 block-test ~/2026-02-09_fixtures_benchmark_v0.0.7/blockchain_tests/benchmark/compute/*/*/* --test-name 100M > ~/block-test_benchmark_compute_control_bf64be2_100M_arm1.log

versus

evmtool --repeat 10 block-test ~/2026-02-09_fixtures_benchmark_v0.0.7/blockchain_tests/benchmark/compute/*/*/* --test-name 100M > ~/block-test_benchmark_compute_evm-fast-paths_100M_arm1.log

Analysis:

python3 ../compare_benchmarks.py --control *control*arm*log --opt *paths*arm*log --output 2026-02-16_benchmark-comparison_control-vs-evm-fast-paths-arm.md
  • Tests compared: 940
  • Anomaly threshold: CV > 15.0%
  • Anomalous tests: 293 (31.2%)

Values shown are the mean across rounds.

Metric All Tests Stable Only (excl. anomalies)
Total 940 852
Improvements (>1%) 239 (25.4%) 234 (27.5%)
Regressions (<-1%) 472 (50.2%) 389 (45.7%)
Neutral (-1% to +1%) 229 (24.4%) 229 (26.9%)
Mean change -1.39% -0.66%
Median change -1.02% -0.37%

The biggest regressions are all well above 60MGas/s.

Slow test reports - where OPCODEs improved/regressed wrt 60MGas/s

python3 ../slow_tests_report.py --files *paths*arm*log --control *control*arm*.log --output 2026-02-16_slow-tests_control-vs-evm-fast-paths-60MGasps-arm.md --threshold 60

Threshold: 60.0 MGas/s
  Control slow: 64  |  Test slow: 66  |  Net: -2
  Escaped: 4  |  Still slow: 60  |  Newly slow: 6

  Escaped by opcode:
    CALL                        3 tests  (+3.24%)
    DELEGATECALL                1 tests  (+3.87%)

  Newly slow by opcode:
    GASLIMIT                    1 tests  (-1.23%)
    MSIZE                       2 tests  (-1.73%)
    NUMBER                      1 tests  (-0.99%)
    RETURNDATASIZE_ZERO         1 tests  (-1.94%)
    TIMESTAMP                   1 tests  (-1.41%)

Escaped Tests (2 tests now above 60.0 MGas/s)

By Opcode
Opcode Count Ctrl Range Test Range Mean Change
SHL 1 58.56-58.56 61.74-61.74 +5.42%
SHR 1 57.02-57.02 60.28-60.28 +5.71%
All Escaped Tests
Ctrl Mean Test Mean Change Opcode Test
59.83 62.15 +3.87% DELEGATECALL test_ext_account_query_warm[initial_storage_True-initial_balance_True-empty_code_False-opcode_DELEGATECALL @ 100M
59.77 61.79 +3.38% CALL test_ext_account_query_warm[initial_storage_False-initial_balance_False-empty_code_True-opcode_CALL @ 100M
58.72 60.64 +3.26% CALL test_ext_account_query_warm[initial_storage_True-initial_balance_True-empty_code_True-opcode_CALL @ 100M
58.72 60.52 +3.07% CALL test_ext_account_query_warm[initial_storage_False-initial_balance_True-empty_code_True-opcode_CALL @ 100M

Newly Slow Tests (6 tests now below 60.0 MGas/s)

By Opcode
Opcode Count Ctrl Range Test Range Mean Change
GASLIMIT 1 60.35-60.35 59.61-59.61 -1.23%
MSIZE 2 60.75-60.83 59.66-59.81 -1.73%
NUMBER 1 60.33-60.33 59.73-59.73 -0.99%
RETURNDATASIZE_ZERO 1 60.55-60.55 59.37-59.37 -1.94%
TIMESTAMP 1 60.51-60.51 59.66-59.66 -1.41%
All Newly Slow Tests
Ctrl Mean Test Mean Change Opcode Test
60.55 59.37 -1.94% RETURNDATASIZE_ZERO test_returndatasize_zero[benchmark-gas-value_100M
60.35 59.61 -1.23% GASLIMIT test_block_context_ops[opcode_GASLIMIT @ 100M
60.51 59.66 -1.41% TIMESTAMP test_block_context_ops[opcode_TIMESTAMP @ 100M
60.75 59.66 -1.78% MSIZE test_msize[mem_size_1 @ 100M
60.33 59.73 -0.99% NUMBER test_block_context_ops[opcode_NUMBER @ 100M
60.83 59.81 -1.68% MSIZE test_msize[mem_size_0 @ 100M

Still Slow Tests (60 tests still below 60.0 MGas/s)

Summary by Opcode
Opcode Count Min MGas/s Max MGas/s Mean Change
MULMOD 4 28.55 32.90 -1.75%
SMOD 4 30.11 36.45 -2.38%
EQ 1 32.09 32.09 -7.11%
POINT_EVALUATION 1 34.19 34.19 -0.19%
MOD 4 35.85 44.96 -3.10%
SDIV 2 36.80 37.30 -1.36%
SUB 1 42.42 42.42 -6.31%
ADDMOD 4 42.75 48.49 -2.51%
BLAKE2F 5 43.07 54.50 +2.92%
SAR 2 43.38 49.17 -2.54%
DIV 2 43.57 43.93 -1.77%
MUL 1 45.13 45.13 -2.49%
ADD 1 51.25 51.25 -6.20%
CODESIZE 1 51.43 51.43 +2.68%
REVERT 1 51.57 51.57 +13.20%
CALLDATACOPY_FROM_ORIGIN 6 54.50 57.41 -2.03%
CALLDATACOPY_FROM_CALL 1 55.14 55.14 -2.45%
CALLCODE 7 56.79 57.96 +3.13%
CALLDATASIZE 8 57.94 58.06 -2.71%
CALL 4 59.27 59.87 +3.14%

Files

2026-02-16_benchmark-comparison_control-vs-evm-fast-paths-arm.md
2026-02-16_slow-tests_control-vs-evm-fast-paths-60MGasps-arm.md

@siladu
Copy link
Contributor Author

siladu commented Feb 16, 2026

Why are there more samples in the optimized version ? in general that indicates that the program takes more time to execute.

Good spot. This was an analysis error as the script normalised the percentages. Attached the updated script.

I ran profiling on my mac so probably too noisy for ADD. Reran on m6a.2xlarge and think it's within acceptable noise...

python3 ../profile_compare_updated.py bf64be2-control-ADD.coll evm-fast-paths-ADD.coll
Parsing profiles...
  Control:    bf64be2-control-ADD.coll
  Fast-paths: evm-fast-paths-ADD.coll

==================================================================================================================================
  PROFILE OVERVIEW
==================================================================================================================================
  Control:      12473 samples  ~124.7s wall time   100 unique stacks
  Fast-paths:   12710 samples  ~127.1s wall time   100 unique stacks
  Difference:    +237 samples  (+1.9%)
  ==> REGRESSION: fast-paths is ~2% SLOWER (more samples = more wall time)

  NOTE: Both profiles run the same workload. Absolute sample counts are directly
  comparable. More samples = more time spent. Percentage share is secondary.

==================================================================================================================================
  FINAL SUMMARY
==================================================================================================================================

  Wall time:  Control ~124.7s  vs  Fast-paths ~127.1s  (+1.9%)

  Category                                          Ctrl       FP    Delta    % Chg
  --------------------------------------------------------------------------------
  AddOperation*                                      153      151       -2    -1.3%
  UInt256.*                                         5169     5192      +23    +0.4%
  FlexStack.*                                       1978     1831     -147    -7.4%
  MessageFrame.*                                    2095     2300     +205    +9.8%
  EVM.runToHalt                                      340      758     +418  +122.9%
  Non-EVM (JIT/OS/GC)                               2057     1902     -155    -7.5%
  TOTAL                                            12473    12710     +237 +1.9%

Files

profile_compare_updated.py
bf64be2-control-ADD.coll.txt
evm-fast-paths-ADD.coll.txt

@siladu siladu changed the title EVM fast path Optimisations - Improves 70% of EEST benchmarks EVM Optimisations - Improves 70% of EEST benchmarks Feb 16, 2026
Signed-off-by: Simon Dudley <simon.dudley@consensys.net>
@siladu siladu enabled auto-merge (squash) February 16, 2026 10:19
@siladu siladu merged commit c4ccec8 into hyperledger:main Feb 16, 2026
46 checks passed
@github-project-automation github-project-automation bot moved this from In Review to Done in Performance Feb 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants