Optimize bytecode for combination enhanced-for and enums
Roel Spilker
r.spilker at gmail.com
Wed Mar 28 06:39:30 PDT 2012
Hi all,
TL;DR: for (Edge edge : Edge.values()) copies an array every time it is
executed. This can be prevented. Is that a good idea and how to proceed
from here?
I'm new to this list, so please let me know if this is not the place to
post this.
When I was profiling our application I notices that we allocate quite some
memory when iterating over enum values. The pattern used was:
class Foo {
void bar() {
for (Edge e : Edge.values()) {
// do some work
}
}
}
The call to Edge.values() obviously creates a new clone of the Edge[]
containing all enum constants. So we've modified our code:
class Foo {
private static final Edge[] EDGES = Edge.values();
void bar() {
for (Edge e : EDGES) {
// do some work
}
}
}
This solves our allocation problem, but it is not a nice solution. Since
code in the enhanced-for has no way to modify the array this pattern can be
done at compile-time. A synthetic inner class can be generated to keep the
copy of the array. The desugared (pseudo) code would then look something
like this:
/* syncthetic */ class Foo$0 {
static final Edge[] EDGES = Edge.values();
}
class Foo {
void bar() {
for (Edge e : Foo$0.EDGES) {
// do some work
}
}
}
There is precedence for this kind of desugaring/optimization: When you use
an enum-in-switch, a synthetic class is generated containing an int array
for the ordinals.
I have a few questions:
- Do you think this is a good optimization? The trade-off here is creating
a copy every time the enhanced-for is used (could be in an inner loop)
versus the overhead of loading an extra class.
- Is there a better optimization possible/required? EnumSet
uses SharedSecrets.getJavaLangAccess().getEnumConstantsShared(elementType),
but that won't work in user code.
- If it is a good idea, how do I proceed from here? Possibly create a JEP?
How can I contribute? Who wants to support?
Roel Spilker
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20120328/e09cd185/attachment.html
More information about the compiler-dev
mailing list