-
-
Notifications
You must be signed in to change notification settings - Fork 31.4k
Unexpected performance penalty when using field initialiser #33698
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Comments
Can you post a reproduction that uses only pure JavaScript? |
@pbadenski thanks, i would recommend reporting this to https://bugs.chromium.org/p/v8/issues/list |
I'm pretty sure this is optimized into a noop. Try to do something like this let instance;
suite.add('A_field_initialized_in_constructor', function() {
instance = new A_field_initialized_in_constructor();
return instance;
});
suite.add('B_field_initialized_as_class_property', function() {
instance = new B_field_initialized_as_class_property();
return instance;
}); and see if it changes the results. |
@lpinca I followed the suggestion - the difference reduced to one order of magnitude, but still surprisingly large:
Test: const { Options, Suite } = require("benchmark");
const runBenchmarkSuite = (suite) => {
return new Promise((resolve, reject) => {
suite
.on("start", (e) => console.log(`Running test: ${e.currentTarget.name}`))
.on("cycle", (e) => console.log(String(e.target)))
.on("complete", (e) => console.log(`Fastest is ${e.currentTarget.filter("fastest").map("name")}`))
.on("complete", resolve)
.on("error", reject)
.run();
});
};
class A_field_initialized_in_constructor {
constructor() {
this.foo = true;
}
}
class B_field_initialized_as_class_property {
foo = true;
}
let instance;
runBenchmarkSuite(new Suite("fields")
.add("A_field_initialized_in_constructor", () => {
instance = new A_field_initialized_in_constructor();
return instance;
})
.add("B_field_initialized_as_class_property", () => {
instance = new B_field_initialized_as_class_property();
return instance;
})
); I'll report to v8. |
Closing as this should be fixed in V8. Feel free to post a link to the V8 issue if it exists. |
I'm getting 2 orders of magnitude performance penalty when using field initialiser. See snippet below (corrected after @devsnek comment):
and the results (using https://www.npmjs.com/package/benchmark):
Environment:
The text was updated successfully, but these errors were encountered: