-
-
Notifications
You must be signed in to change notification settings - Fork 2k
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
Codegen generates inefficient Java code for Long
and Boolean
mandatory parameters
#2985
Comments
I've always understood null checks to be quite efficient and we're not boxing/unboxing any primitives. How much time is lost here in the context of parsing Gherkin? |
It's hard to tell the full performance impact, but at least creating the |
That doesn't sound too terrible, nearly every line has a location, multiple if there table cells on the line. |
I found the issue. There a lot of By caching the about 4000 |
Separating out the elements from #372 that involve Location * Replaced `io.cucumber.gherkin.Location` with `io.cucumber.messages.types.Location` to reduce creation of temporary objects. * Ensure `Token.location` is non-null. * `Location` instances are created through `Locations` utility allowing for reuse of `Long` objects. * Pre-create `Long` objects for 0 through 4000 to avoid churn while parsing. Fixes: #384
Moved to Cucumber-JVM for tracking, changing this in messages will be a major change for Cucumber-JVM. |
It would be worth while to use While Same for other required primitives. https://docs.oracle.com/javase/8/docs/api/java/util/OptionalLong.html |
👓 What did you see?
For
Long
parameters, the codegen generates Java code which looks like this:The parameters of type
Long
are most of the time required to be non-null, but still we are storing them into a object, not a primitive type.This occurs for the following generated types:
Duration
(bothseconds
andnanos
fields)Location
(line
field but notcolumn
field)TestCaseStarted
(attempt
field)Timestamp
(bothseconds
andnanos
fields)Note that
Group
contains a non-mandatory fieldstart
.The
Boolean
type is also impacted by the same issue, i.e. for the generated classes :ParameterType
(preferForRegularExpressionMatch
anduseForSnippets
fields)TestCaseFinished
(willBeRetried
field)TestRunFinished
(success
field)✅ What did you expect to see?
If the
java.java.erb
code generator see aLong
which is mandatory, it should generate along
primitive type, so that no conversion is done.This will avoid back and forth
Long
<->long
conversions, so will lead to faster code.The same apply to
Boolean
type.This would probably cause a breaking change because all interfaces to the impacted classes will change.
📦 Which tool/library version are you using?
gherkin 31.0.0 (which uses messages-27.2.0)
🔬 How could we reproduce it?
N/A (Look at the generated code).
📚 Any additional context?
The performance impact has been detected while working on cucumber/gherkin#361, using IntelliJ Profiler (it's hard to see the real impact because there is a lot of generated classes which suffer from this syndrome).
The text was updated successfully, but these errors were encountered: