Hi all,<div><br></div><div>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?</div><div><br></div><div>I&#39;m new to this list, so please let me know if this is not the place to post this.</div>
<div><br></div><div>When I was profiling our application I notices that we allocate quite some memory when iterating over enum values. The pattern used was:</div><div><br></div><div>class  Foo {</div><div>  void bar() {</div>
<div>    for (Edge e : Edge.values()) {</div><div>      // do some work</div><div>    }</div><div>  }</div><div>}</div><div><br></div><div>The call to Edge.values() obviously creates a new clone of the Edge[] containing all enum constants. So we&#39;ve modified our code:</div>
<div><br></div><div>class  Foo {</div><div>  private static final Edge[] EDGES = Edge.values();</div><div>  </div><div>  void bar() {</div><div><div>    for (Edge e : EDGES) {</div><div>      // do some work</div><div>    }</div>
<div>  }</div><div>}</div><br class="Apple-interchange-newline"></div><div>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:</div>
<div><br></div><div>/* syncthetic */ class Foo$0 {</div><div>  static final Edge[] EDGES = Edge.values();</div><div>}</div><div><br></div><div><div>class  Foo {</div><div>  void bar() {</div><div><div>    for (Edge e : Foo$0.EDGES) {</div>
<div>      // do some work</div><div>    }</div><div>  }</div><div>}</div></div><div><br></div><div>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.</div>
</div><div><br></div><div>I have a few questions:</div><div>- 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.</div>
<div>- Is there a better optimization possible/required? EnumSet uses SharedSecrets.getJavaLangAccess().getEnumConstantsShared(elementType), but that won&#39;t work in user code.</div><div>- If it is a good idea, how do I proceed from here? Possibly create a JEP? How can I contribute? Who wants to support?</div>
<div><br></div><div>Roel Spilker</div><div><br></div>