-
Notifications
You must be signed in to change notification settings - Fork 5.4k
Debug
trait and its auto implementation
#7015
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
base: master
Are you sure you want to change the base?
Conversation
CodSpeed Performance ReportMerging #7015 will degrade performances by 34.31%Comparing Summary
Benchmarks breakdown
|
9122060
to
efa2227
Compare
76a644c
to
d49c3c8
Compare
sway-core/src/semantic_analysis/ast_node/declaration/auto_impl/abi_encoding.rs
Outdated
Show resolved
Hide resolved
6c71af2
to
21c345f
Compare
This is the performance status after #7080 Before, the Now is going from We still have the performance hit because we have a lot of more |
I agree. |
Can we just add a feature flag to disable this debug generation altogether, and that way the LSP can just disable this feature until it's more performant? Ie. have this enabled by default, but allow the lsp to opt-out. |
That's sounds like a good idea to keep performance high for LSP. We already have an #[derive(Clone, Debug, Default)]
pub struct LspConfig {
// This is set to true if compilation was triggered by a didChange LSP event. In this case, we
// bypass collecting type metadata and skip DCA.
//
// This is set to false if compilation was triggered by a didSave or didOpen LSP event.
pub optimized_build: bool,
// The value of the `version` field in the `DidChangeTextDocumentParams` struct.
// This is used to determine if the file has been modified since the last compilation.
pub file_versions: BTreeMap<PathBuf, Option<u64>>,
} |
We can, but if someone uses the What we may be able to do is turn off auto-impl of the |
Can we just make the __dbg() intrinsic do a noop from the compilation perspective if the flag is set to disable it? |
I will also look to see if there is anything else we can do for performance. |
3229229
to
21c345f
Compare
FYI @JoshuaBatty getting the selective compilation for the dbg traits working had a lot of potential footguns, and given the optimizations that @xunilrj already did in #7080 we are thinking the performance hit from this PR may not be perceivable enough on the LSP to prevent merging it. If you give the green light for this minor hit then we can merge this pr and finish the release. Additional Note ℹ️ : here is the regression compared the to the previous release of sway (0.67) instead of comparing to master. This is probably a more fair comparison to gauge against as it takes into account other optimization PRs that have gone in since the last release https://codspeed.io/FuelLabs/sway/runs/compare/67d2b63344ebf149d5f14115..67ffe3f48cbfc11bb7f1ff8c |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for looking into the performance improvements Daniel. Very much appreciated!
Disabling auto-merge to wait for #7093 to merge first as it's a prequel to this work. |
Description
This PR implements the
__dbg(...)
intrinsic, which is very similar to Rustdbg!(...)
macro.Up until now, it has being the norm to use
__log
to debug values. Given that this is NOT the first use case for log, we have always found some issues with it: log does not work on predicates, log does not show "private" fields likeVec::capacity
and others.To solve these problems
__dbg
is being introduced:1 - it will work on all program types, including predicates;
2 - it also prints the file name, line and column;
3 - All types will have an automatic implementation of Debug if possible, which can still be customized.
4 - Even
raw_ptr
and other non "loggable" types, haveDebug
impls.5 -
__dbg
will be completely stripped in the release build by default. It can be turned on again if needed.So this:
will generate this:
How does this work?
__dbg(value)
intrinsic is desugared into{ let f = Formatter{}; f.print_str(...); let value = value; value.fmt(f); value }
.Formatter
is similar to Rust's one. The difference is that we still do not support string formatting, so theFormatter
has a lot ofprint_*
functions.And each
print
function calls a "syscall". Thissyscall
usesecal
under the hood and it follows unix write syscall schema.For that to work, the VM interpreter must have its
EcalState
setup and interpret syscall number 1000 aswrite
. This PR does this forforc test
and oure2e test suite
.Each test in
forc test
will capture these calls and only print to the terminal when requested with the--log
flag.Garbage Collector and auto generated
Before, we were associating all auto-generated code with a pseudo file called "<autogenerated>.sw" that was never garbage collected.
This generated a problem inside the LSP when the
auto_impl.rs
ran a second time because of a collision in the "shareable type" map. When we try to solve this collision, choosing to keep the old value or to insert the new, the type inside the map points to already collected types and the compiler panics. This is a known problem.The workaround for this is to break the auto-generated code into multiple files. Now they are named "main.autogenerated.sw", for example. We create one pseudo-file for each real file that needs one.
When we garbage collect one file,
main.sw
, for example, we also collect its associated auto-generated file.Checklist
Breaking*
orNew Feature
labels where relevant.