Latest Results
Optimize dynamic `std` types (#7683)
## Description
This PR optimizes several aspects of dynamic `std` types:
- Hashing of string arrays, by properly accommodating initial `Hasher`
buffer capacity for the string length prefix.
- `Bytes::clear`, by reusing the already allocated buffer, the same way
`Vec` is doing it.
- Removing expensive double-allocation and memory-copy in the
`Bytes::append_raw_slice`.
- Adding `from_moved_...` constructors to types that own their buffers,
for supporting taking ownership of the content without copying it.
- Adding `from_ascii_str_array` constructor to `String` to create a
string directly from string array without a need to first copy it to
`str` via `from_str_array`.
Additionally, the PR:
- fixes invalid doc-comment examples on `String` methods, that were
using a non-existing `String::push` method.
## Performance Improvements
Performance improvements are given in the comment below. Although the PR
obviously only removes runtime overhead, we still have some smaller
numbers of regressions. Regressions are analyzed and have the same
root-cause, the one we already encountered before. The leaner
`Bytes::append_raw_slice` now leads to more inlining in hashing code
like `sha256` that brings `CastPtr` to caller scope suppressing
potential optimizations in the caller.
The regressions on real-life o2 code are small and in contract methods
that are not frequently used while improvements are bigger and in often
use contract methods.
Improving this particular issue will be done in #7492.
Also, analysis of regressions in `sha256` and `keccak256` calls revealed
another potentially high future performance improvement. E.g., hashing a
`b256` using `s256` opcode directly costs ~60 gas units, while using
`sha256` function will cost ~250 gas units. Similar values for are for
`u8`, .., `u256` and even worse for larger structured types. One way to
improve our hashing abstractions is to introduce a concept of "trivially
hashable types", similar to trivially encodeable and decodeable.
## Checklist
- [x] I have linked to any relevant issues.
- [x] I have commented my code, particularly in hard-to-understand
areas.
- [x] 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).
- [x] I have requested a review from the relevant team or maintainers. Latest Branches
0%
ironcev/optionally-print-ir-metadata 0%
0%
© 2026 CodSpeed Technology