Commit 6bca188
Improve method selector on contracts (#7458)
## Description
This PR continues the optimisation of contract calls on top of
#7455. Now the contract method
selector is optimised. Ideally, the method selection would just be a
`match` and we would let the compiler generate the best code.
But we are not there yet. So, for now, we are going to first test the
called method length. And based on its length we are going to check the
whole string. Something like:
```sway
if called_method.len() == 5 {
if called_method == "abcde" {
...
}
if called_method == "fghij" {
...
}
}
if called_method.len() == 10 {
if called_method == "..." {
....
}
}
```
This alone reduces gas a lot.
To understand why `match_expressions_all` gas usage is much worse see
below.
| Test | Before | After | Percentage |
|------|--------|-------|------------|
| should_pass/empty_fields_in_storage_struct
(test.toml)::test_read_write_bytes | 17533 | 12080 | 31.10% |
| should_pass/empty_fields_in_storage_struct
(test.toml)::test_read_write_map | 13986 | 8502 | 39.21% |
| should_pass/empty_fields_in_storage_struct
(test.toml)::test_read_write_vec | 29288 | 12797 | 56.31% |
| should_pass/language/associated_const_abi (test.toml)::test | 7817 |
4547 | 41.83% |
| should_pass/language/associated_const_abi_multiple (test.toml)::test |
2097 | 1511 | 27.94% |
| should_pass/language/associated_const_in_decls_of_other_constants
(test.toml)::test | 709 | 537 | 24.26% |
| should_pass/language/contract_ret_intrinsic (test.toml)::test | 1809 |
1465 | 19.02% |
| should_pass/language/match_expressions_all (test.toml) | 764 | 3708 |
-385.34% |
| should_pass/language/pusha_popa_multiple_defreg
(test.toml)::incorrect_pusha_popa | 624 | 451 | 27.72% |
| should_pass/language/raw_identifiers (test.error_type.toml)::test |
1075 | 903 | 16.00% |
| should_pass/language/raw_identifiers (test.toml)::test | 1075 | 903 |
16.00% |
| should_pass/language/references/mutability_of_references_memcpy_bug
(test.toml)::test | 1203 | 1031 | 14.30% |
| should_pass/language/slice/slice_contract (test.toml)::test_success |
1145 | 920 | 19.65% |
| should_pass/language/string_slice/string_slice_contract
(test.toml)::test_success | 1322 | 1079 | 18.38% |
| should_pass/stdlib/storage_vec_insert (test.toml)::test_test_function
| 3831 | 3669 | 4.23% |
| should_pass/storage_element_key_modification
(test.toml)::test_storage_key_address | 1138 | 943 | 17.14% |
| should_pass/storage_element_key_modification
(test.toml)::test_storage_key_modification | 757 | 465 | 38.57% |
| should_pass/storage_slot_key_calculation (test.toml)::test | 2979 |
2785 | 6.51% |
| should_pass/superabi_contract_calls (test.toml)::tests | 1812 | 1310 |
27.70% |
| should_pass/superabi_supertrait_external_call (test.toml) | 95 | 76 |
20.00% |
| should_pass/superabi_supertrait_same_methods (test.toml)::tests | 936
| 634 | 32.26% |
| should_pass/test_abis/abi_impl_methods_callable (test.toml)::tests |
772 | 599 | 22.41% |
| should_pass/test_abis/contract_abi-auto_impl (test.toml)::tests | 772
| 599 | 22.41% |
| should_pass/unit_tests/aggr_indexing (test.toml)::test1 | 5443 | 4282
| 21.33% |
| should_pass/unit_tests/contract-multi-contract-calls
(test.toml)::test_contract_2_call | 804 | 631 | 21.52% |
| should_pass/unit_tests/contract-multi-contract-calls
(test.toml)::test_contract_call | 807 | 634 | 21.44% |
| should_pass/unit_tests/contract-multi-contract-calls
(test.toml)::test_contract_multi_call | 1592 | 1246 | 21.73% |
| should_pass/unit_tests/contract_multi_test (test.toml)::test_fail |
808 | 635 | 21.41% |
| should_pass/unit_tests/contract_multi_test (test.toml)::test_success |
806 | 633 | 21.46% |
| should_pass/unit_tests/script-contract-calls
(test.toml)::test_contract_call | 736 | 563 | 23.51% |
| should_pass/unit_tests/workspace_test (test.toml)::test_fail | 808 |
635 | 21.41% |
| should_pass/unit_tests/workspace_test (test.toml)::test_success | 807
| 634 | 21.44% |
# Radix Trie
This PR also turns off the radix trie optimisation at
`sway-core/src/semantic_analysis/ast_node/expression/match_expression/typed/typed_match_expression.rs`.
I am not 100% sure of its correctness and heuristics.
We need a better way to decide when not to use it. One of the examples
where the generated code is worse is when all strings are very similar.
For example: `get_a` , `get_b`. The generated trie will first test its
length. Both have length 5. Not much was gained. Then it tests if for
`get_`, which makes sense as it is the common substring. And the last
step will test for `a` or `b`.
The issue is that all branches and jumps of the last step are not worthy
to test just one character. Is probably cheaper to just test the whole
string for each option.
In the end, we need a better heuristic to determine when to use this
optimisation.
## Checklist
- [x] I have linked to any relevant issues.
- [x] I have commented my code, particularly in hard-to-understand
areas.
- [ ] I have updated the documentation where relevant (API docs, the
reference, and the Sway book).
- [ ] If my change requires substantial documentation changes, I have
[requested support from the DevRel
team](https://github.com/FuelLabs/devrel-requests/issues/new/choose)
- [x] I have added tests that prove my fix is effective or that my
feature works.
- [ ] I have added (or requested a maintainer to add) the necessary
`Breaking*` or `New Feature` labels where relevant.
- [x] I have done my best to ensure that my PR adheres to [the Fuel Labs
Code Review
Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md).
- [ ] I have requested a review from the relevant team or maintainers.
---------
Co-authored-by: Joshua Batty <[email protected]>1 parent e6f2ac8 commit 6bca188
File tree
25 files changed
+844
-752
lines changed- forc-plugins/forc-client/tests
- forc/tests
- sway-core/src/semantic_analysis/ast_node
- declaration/auto_impl
- expression/match_expression/typed
- sway-ir/src
- sway-lib-std/src
- test/src/e2e_vm_tests/test_programs/should_pass
- language
- array/array_repeat
- attributes_deprecated
- configurable_dedup_decode
- match_expressions_all
- panic_expression/panicking_contract
- require_contract_deployment
- array_of_structs_caller/src
- asset_ops_test/src
- bal_opcode/src
- call_abi_with_tuples/src
- call_basic_storage/src
- call_contract_with_type_aliases/src
- call_increment_contract/src
- call_storage_enum/src
- caller_auth_test/src
- caller_context_test/src
- nested_struct_args_caller/src
- storage_access_caller/src
- test_contracts/const_of_contract_call
25 files changed
+844
-752
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
377 | 377 | | |
378 | 378 | | |
379 | 379 | | |
380 | | - | |
| 380 | + | |
381 | 381 | | |
382 | 382 | | |
383 | 383 | | |
| |||
421 | 421 | | |
422 | 422 | | |
423 | 423 | | |
424 | | - | |
| 424 | + | |
425 | 425 | | |
426 | 426 | | |
427 | 427 | | |
| |||
468 | 468 | | |
469 | 469 | | |
470 | 470 | | |
471 | | - | |
| 471 | + | |
472 | 472 | | |
473 | 473 | | |
474 | 474 | | |
475 | 475 | | |
476 | | - | |
| 476 | + | |
477 | 477 | | |
478 | 478 | | |
479 | 479 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
51 | 51 | | |
52 | 52 | | |
53 | 53 | | |
54 | | - | |
| 54 | + | |
55 | 55 | | |
56 | 56 | | |
57 | | - | |
| 57 | + | |
58 | 58 | | |
59 | 59 | | |
60 | 60 | | |
| |||
77 | 77 | | |
78 | 78 | | |
79 | 79 | | |
80 | | - | |
| 80 | + | |
81 | 81 | | |
82 | 82 | | |
83 | 83 | | |
84 | 84 | | |
85 | | - | |
| 85 | + | |
86 | 86 | | |
87 | 87 | | |
88 | 88 | | |
Lines changed: 27 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| 11 | + | |
11 | 12 | | |
12 | 13 | | |
13 | 14 | | |
| |||
312 | 313 | | |
313 | 314 | | |
314 | 315 | | |
315 | | - | |
316 | | - | |
317 | 316 | | |
318 | 317 | | |
319 | 318 | | |
320 | 319 | | |
321 | 320 | | |
322 | 321 | | |
| 322 | + | |
| 323 | + | |
323 | 324 | | |
| 325 | + | |
324 | 326 | | |
325 | 327 | | |
326 | 328 | | |
| |||
382 | 384 | | |
383 | 385 | | |
384 | 386 | | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
385 | 397 | | |
386 | | - | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
387 | 401 | | |
388 | 402 | | |
389 | 403 | | |
| |||
454 | 468 | | |
455 | 469 | | |
456 | 470 | | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
457 | 475 | | |
458 | 476 | | |
| 477 | + | |
459 | 478 | | |
460 | | - | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
461 | 484 | | |
462 | 485 | | |
463 | 486 | | |
| |||
0 commit comments