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

[seqbench] the-good-parts-mk2 sequence (on Cancun) #15031

Closed
wants to merge 3 commits into from

Conversation

cameel
Copy link
Member

@cameel cameel commented Apr 15, 2024

Related to #14406
Depends on #15023 (only for benchmarking)

Do not merge. This is just a test PR to evaluate how the the-good-parts-mk2 sequence would affect costs in CI.

This PR replaces #14928. The original PR contains a lot of analysis that is still relevant, but I want to gather benchmarks on top of 0.8.25 (which made cancun the default EVM version) for a fair comparison with the-good-parts-mk3 (#15030).

…didate

- `the-good-parts` variant found using seqbench.
- second refinement, based on the erc20.sol contract.
@cameel
Copy link
Member Author

cameel commented Apr 15, 2024

gas_diff_stats

File name IR optimized Legacy optimized Legacy
array/create_memory_array.sol 9%
array/array_storage_push_empty_length_address.sol 8%
externalContracts/base64.sol 8% -0%
array/array_storage_index_boundary_test.sol 7%
array/delete/bytes_delete_element.sol 7% -0%
array/copying/bytes_storage_to_storage.sol 6% -0%
array/copying/cleanup_during_multi_element_per_slot_copy.sol 6%
array/copying/storage_memory_packed_dyn.sol 5%
array/byte_array_transitional_2.sol 5%
array/copying/array_copy_cleanup_uint40.sol 5%
abiEncoderV2/calldata_array.sol 3%
array/array_storage_push_pop.sol 3%
inheritance/inherited_function_calldata_memory_interface.sol 3%
abiEncoderV2/abi_encode_calldata_slice.sol 3% -0%
abiEncoderV1/abi_encode_calldata_slice.sol 3% -0%
array/array_storage_push_empty.sol 2%
array/array_storage_index_zeroed_test.sol 2%
isoltestTesting/balance_other_contract.sol 2%
externalContracts/prbmath_unsigned.sol 2%
array/dynamic_arrays_in_storage.sol 2%
externalContracts/FixedFeeRegistrar.sol 1% +0%
various/erc20.sol 1% +0%
events/event_indexed_string.sol 1% -0%
abiEncoderV2/abi_encode_v2_in_function_inherited_in_v1_contract.sol 1% -0%
array/fixed_arrays_as_return_type.sol 1% -0%
array/push/byte_array_push_transition.sol 1%
various/selfdestruct_pre_cancun_multiple_beneficiaries.sol 1%
various/selfdestruct_post_cancun_multiple_beneficiaries.sol 1%
userDefinedValueType/erc20.sol 1% +0%
array/copying/array_of_struct_calldata_to_storage.sol 1%
array/copying/array_copy_clear_storage.sol 1%
array/copying/memory_dyn_2d_bytes_to_storage.sol 1% -0%
constructor/bytes_in_constructors_packer.sol +0% 1%
events/event_dynamic_array_storage_v2.sol 1% +0%
events/event_dynamic_array_storage.sol 1% +0%
array/array_storage_index_access.sol 1%
externalContracts/prbmath_signed.sol 1%
various/value_complex.sol 1%
various/value_insane.sol +0%
salted_create/salted_create_with_value.sol +0%
byte_array_to_storage_cleanup.sol 1% -0%
array/push/array_push.sol +0%
structs/memory_structs_nested_load.sol +0%
externalContracts/snark.sol +0%
array/copying/array_of_struct_memory_to_storage.sol +0%
array/pop/byte_array_pop_long_storage_empty.sol +0%
array/copying/storage_memory_nested_from_pointer.sol +0%
array/copying/storage_memory_nested.sol +0%
various/selfdestruct_post_cancun_redeploy.sol +0%
various/selfdestruct_pre_cancun_redeploy.sol +0%
array/copying/array_copy_storage_storage_different_base.sol +0%
array/copying/copy_byte_array_to_storage.sol +0% -0%
array/push/push_no_args_bytes.sol +0%
structs/struct_memory_to_storage_function_ptr.sol +0%
array/copying/array_copy_storage_storage_dynamic_dynamic.sol +0%
structs/struct_delete_storage_with_array.sol +0%
array/push/nested_bytes_push.sol +0% -0%
array/constant_var_as_array_length.sol +0% +0%
array/copying/array_of_structs_containing_arrays_calldata_to_storage.sol +0%
array/dynamic_multi_array_cleanup.sol +0%
structs/struct_copy_via_local.sol +0%
externalContracts/deposit_contract.sol +0% +0%
array/push/array_push_struct.sol +0%
abiEncoderV1/struct/struct_storage_ptr.sol +0%
libraries/using_library_mappings_public.sol +0%
array/fixed_arrays_in_constructors.sol +0%
array/copying/array_copy_different_packing.sol +0%
constructor/constructor_arguments_external.sol +0%
array/copying/nested_array_element_storage_to_storage.sol +0%
viaYul/copy_struct_invalid_ir_bug.sol +0%
userDefinedValueType/calldata.sol +0% -0%
array/copying/array_copy_storage_to_memory_nested.sol +0% +0%
storage/packed_storage_structs_bytes.sol +0%
abiEncoderV2/abi_encode_v2.sol +0% +0%
array/copying/calldata_array_dynamic_to_storage.sol +0% -0%
array/dynamic_array_cleanup.sol +0%
inheritance/value_for_constructor.sol +0%
array/copying/array_nested_calldata_to_storage.sol +0%
immutable/use_scratch.sol +0%
constructor/constructor_static_array_argument.sol +0% -0%
events/event_dynamic_nested_array_storage_v2.sol +0% +0%
array/push/array_push_struct_from_calldata.sol +0% -0%
various/destructuring_assignment.sol +0% -0%
array/copying/array_copy_target_simple.sol +0%
array/copying/array_copy_including_array.sol +0%
functionCall/creation_function_call_with_salt.sol +0%
array/copying/array_copy_storage_storage_different_base_nested.sol +0%
array/copying/storage_memory_nested_struct.sol +0%
array/copying/nested_array_of_structs_calldata_to_storage.sol +0%
array/copying/elements_of_nested_array_of_structs_calldata_to_storage.sol +0%
structs/copy_struct_array_from_storage.sol +0%
functionCall/creation_function_call_with_args.sol +0%
array/copying/array_nested_memory_to_storage.sol +0%
types/mapping/copy_from_mapping_to_mapping.sol +0% +0%
array/copying/nested_dynamic_array_element_calldata_to_storage.sol +0%
array/fixed_array_cleanup.sol +0%
array/copying/nested_array_of_structs_memory_to_storage.sol +0%
array/copying/array_copy_storage_storage_struct.sol +0%
array/copying/array_copy_storage_storage_static_dynamic.sol +0%
abiencodedecode/abi_decode_simple_storage.sol +0% -0%
structs/calldata/calldata_struct_with_nested_array_to_storage.sol +0% +0%
array/bytes_length_member.sol +0%
array/reusing_memory.sol +0%
array/pop/array_pop_array_transition.sol +0%
array/push/array_push_nested_from_calldata.sol +0% -0%
array/copying/nested_array_of_structs_storage_to_storage.sol +0%
array/copying/array_of_structs_containing_arrays_memory_to_storage.sol +0%
abiEncoderV1/abi_decode_v2_storage.sol +0% +0%
array/push/push_no_args_2d.sol +0%
array/copying/array_storage_multi_items_per_slot.sol +0%
structs/struct_copy.sol +0%
abiEncoderV2/calldata_overlapped_dynamic_arrays.sol +0% -0%
array/copying/copy_function_internal_storage_array.sol +0%
array/copying/array_copy_storage_storage_dyn_dyn.sol +0%
various/staticcall_for_view_and_pure.sol -0%
array/array_storage_length_access.sol -0%
calldata/copy_from_calldata_removes_bytes_data.sol -0%
array/copying/array_copy_storage_storage_static_static.sol -0%
array/copying/bytes_inside_mappings.sol -0%
array/invalid_encoding_for_storage_byte_array.sol -0% -0%
array/copying/array_of_function_external_storage_to_storage_dynamic_different_mutability.sol -0% +0%
constructor/no_callvalue_check.sol -0%
array/copying/copy_byte_array_in_struct_to_storage.sol -0% -0%
array/copying/array_copy_nested_array.sol -0% -0%
array/copying/elements_of_nested_array_of_structs_memory_to_storage.sol -0%
array/array_memory_index_access.sol -0%
array/copying/copy_removes_bytes_data.sol -0%
various/many_subassemblies.sol -0%
immutable/multi_creation.sol -0%
constructor/bytes_in_constructors_unpacker.sol -0% +0%
array/copying/calldata_array_to_mapping.sol -0%
array/copying/array_to_mapping.sol -0% +0%
array/copying/array_of_function_external_storage_to_storage_dynamic.sol -0% -0%
array/copying/storage_memory_nested_bytes.sol -0% +0%
structs/struct_containing_bytes_copy_and_delete.sol -0% -0%
array/copying/array_copy_target_simple_2.sol -0%
array/copying/function_type_array_to_storage.sol -0% -0%
abiEncoderV2/storage_array_encoding.sol -0% -0%
structs/copy_substructures_from_mapping.sol -0% -0%
array/copying/array_elements_to_mapping.sol -0% +0%
various/skip_dynamic_types_for_structs.sol -0% -0%
storage/empty_nonempty_empty.sol -0% -0%
structs/copy_to_mapping.sol -0% -0%
structs/copy_from_mapping.sol -0% -0%
array/pop/byte_array_pop_long_storage_empty_garbage_ref.sol -0%
array/copying/array_copy_calldata_storage.sol -0% -0%
array/pop/array_pop_uint16_transition.sol -0%
array/copying/arrays_from_and_to_storage.sol -0%
array/pop/array_pop_uint24_transition.sol -0%
functionCall/gas_and_value_brace_syntax.sol -0%
functionCall/gas_and_value_basic.sol -0%
structs/copy_substructures_to_mapping.sol -0% -0%
libraries/internal_types_in_library.sol -0%
functionCall/external_call_to_nonexisting_debugstrings.sol -1% +0%
constructor/arrays_in_constructors.sol -1% +0%
structs/structs.sol -0%
functionCall/mapping_array_internal_argument.sol -0%
array/pop/byte_array_pop_masking_long.sol -0%
array/copying/array_copy_target_leftover.sol -0% -0%
structs/conversion/recursive_storage_memory.sol -0%
externalContracts/strings.sol -0% +0%
libraries/using_library_mappings_return.sol -1%
various/address_code.sol -0% -0%
array/arrays_complex_from_and_to_storage.sol -1% +0%
various/create_calldata.sol -1%
functionCall/external_call_to_nonexisting.sol -1% 1%
inlineAssembly/transient_storage_selfdestruct.sol -1%
array/function_array_cross_calls.sol -2% 1%
externalContracts/ramanujan_pi.sol -6%

@cameel
Copy link
Member Author

cameel commented Apr 15, 2024

Time benchmark

the-good-parts-mk2

test/benchmarks/run.sh modified to use the new sequence with solc 0.8.25 release binary.

File Pipeline Bytecode size Time Exit code
verifier.sol legacy 4899 bytes 0.10 s 0
verifier.sol via-ir 4324 bytes 0.37 s 0
OptimizorClub.sol legacy 0 bytes 0.37 s 1
OptimizorClub.sol via-ir 22170 bytes 1.89 s 0
chains.sol legacy 5866 bytes 0.12 s 0
chains.sol via-ir 21398 bytes 10.71 s 0

default sequence for reference

File Pipeline Bytecode size Time Exit code
verifier.sol legacy 4874 bytes 0.14 s 0
verifier.sol via-ir 4351 bytes 0.70 s 0
OptimizorClub.sol legacy 0 bytes 0.55 s 1
OptimizorClub.sol via-ir 22193 bytes 3.94 s 0
chains.sol legacy 5845 bytes 0.19 s 0
chains.sol via-ir 23043 bytes 21.33 s 0

@cameel
Copy link
Member Author

cameel commented Apr 15, 2024

External test benchmark diff

CI run on timing-info-in-external-test-report vs CI run on seqbench-sequence-the-good-parts-mk2-cancun

ir-no-optimize

project bytecode_size deployment_gas method_gas
brink 0%
colony 0%
elementfi 0%
ens 0%
euler
gnosis
gp2 0%
perpetual-pools 0% +0% -0.01% ✅
pool-together 0%
uniswap 0%
yield_liquidator 0% -0% 0%
zeppelin

ir-optimize-evm+yul

project bytecode_size deployment_gas method_gas
brink +0.55% ❌
colony +0.13% ❌
elementfi -1.75% ✅
ens -0.93% ✅ -2.96% ✅ -0.01% ✅
euler +1.21% ❌
gnosis
gp2 +0.5% ❌
perpetual-pools +0.07% ❌ -0.23% ✅ +0.15% ❌
pool-together -1.2% ✅
uniswap +1.65% ❌
yield_liquidator +0.93% ❌ -0.09% ✅ +0.04% ❌
zeppelin -0.4% ✅ -1.21% ✅ -0.04% ✅

ir-optimize-evm-only

project bytecode_size deployment_gas method_gas
brink 0%
colony 0%
elementfi 0%
ens 0% -0% 0%
euler
gnosis
gp2 0%
perpetual-pools 0% +0% -0%
pool-together 0%
uniswap 0%
yield_liquidator 0% +0% 0%
zeppelin 0%

legacy-no-optimize

project bytecode_size deployment_gas method_gas
brink 0%
colony 0%
elementfi 0%
ens 0%
euler 0%
gnosis 0%
gp2 0%
perpetual-pools 0% -0% -0.01% ✅
pool-together 0%
uniswap 0%
yield_liquidator 0% -0% 0%
zeppelin 0% +0% +0%

legacy-optimize-evm+yul

project bytecode_size deployment_gas method_gas
brink -0.03% ✅
colony +0.13% ❌
elementfi +0.1% ❌
ens +0.2% ❌ -0.01% ✅ -0%
euler +0.16% ❌
gnosis +0.18% ❌
gp2 +0.3% ❌
perpetual-pools -0.01% ✅ +0.01% ❌ +0.02% ❌
pool-together +0.04% ❌
uniswap +0.04% ❌
yield_liquidator +0.06% ❌ +0.02% ❌ -0.01% ✅
zeppelin +0.17% ❌ +0.18% ❌ +0.02% ❌

legacy-optimize-evm-only

project bytecode_size deployment_gas method_gas
brink 0%
colony 0%
elementfi 0%
ens 0% -0% 0%
euler 0%
gnosis 0%
gp2 0%
perpetual-pools 0% +0% -0%
pool-together 0%
uniswap 0%
yield_liquidator 0% 0% 0%
zeppelin 0% -0% +0.09% ❌

!V = version mismatch
!B = no value in the "before" version
!A = no value in the "after" version
!T = one or both values were not numeric and could not be compared
-0 = very small negative value rounded to zero
+0 = very small positive value rounded to zero

@cameel
Copy link
Member Author

cameel commented Apr 15, 2024

External test compilation time

Test Time (default) Time (mk2) Time (mk3)
brink 5 s 4 s 4 s
colony 110 s 97 s 117 s
elementfi 168 s 105 s 98 s
ens 41 s 26 s 32 s
euler 64 s 36 s 42 s
gp2 40 s 32 s 35 s
perpetual-pools 77 s 47 s 65 s
pool-together 83 s 36 s 31 s
uniswap 105 s 56 s 49 s
yield_liquidator 30 s 18 s 22 s
zeppelin 263 s 160 s 139 s

Table includes also timing of the default sequence (timing-info-in-external-test-report branch) and the-good-parts-mk3 sequence (#15030) for comparison.

Base automatically changed from timing-info-in-external-test-report to develop April 15, 2024 14:14
@cameel cameel closed this Apr 22, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

1 participant