<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
Hi Alexey,
<div class=""><br class="">
</div>
<div class=""> There could be other reasons as well, but - those recorded results were for x64 only at that time. Performance degradation is comparatively more when run on M1 systems.</div>
<div class=""><br class="">
</div>
<div class="">Regards,</div>
<div class="">Ajit<br class="">
<div><br class="">
<blockquote type="cite" class="">
<div class="">On 09-Dec-2022, at 12:50 AM, Alexey Ushakov <<a href="mailto:alexey.ushakov@jetbrains.com" class="">alexey.ushakov@jetbrains.com</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
Hi Ajit,
<div class=""><br class="">
</div>
<div class="">According to the tests you’ve mentioned it’s not a big difference. Looks like we’ve faced with completely different scenario. I’ll try to figure out the main reason of the failure.</div>
<div class=""><br class="">
</div>
<div class="">Best Regards,</div>
<div class="">Alexey </div>
<div class="">
<div class=""><br class="">
<blockquote type="cite" class="">
<div class="">On Dec 8, 2022, at 12:38 PM, Ajit Ghaisas <<a href="mailto:ajit.ghaisas@oracle.com" class="">ajit.ghaisas@oracle.com</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
<br class="">
<div class=""><br class="">
<blockquote type="cite" class="">
<div class="">On 08-Dec-2022, at 1:50 PM, Alexey Ushakov <<a href="mailto:alexey.ushakov@jetbrains.com" class="">alexey.ushakov@jetbrains.com</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
<blockquote type="cite" class="">
<div class=""><br class="">
</div>
<div class="">FWIW we have just had at a report of a performance drop in JDK 20 from a b07 change to show how it takes<br class="">
time for these things to be discovered.</div>
</blockquote>
Could you provide some more details concerning the regression? We also faced with a regression in metal rendering (<a href="https://urldefense.com/v3/__https://youtrack.jetbrains.com/issue/JBR-4849__;!!ACWV5N9M2RV99hQ!IGt32jobqI206Dm2bA6yJfDrvnugMoQygowL66VIPXfegeFCuprHsXLVNZUDG7C_y1gzas0MW8u8hEEMAjvAoIMxls-dzg$" class="">https://youtrack.jetbrains.com/issue/JBR-4849</a>
). It was caused by <a href="https://bugs.openjdk.org/browse/JDK-8288948" class="">
https://bugs.openjdk.org/browse/JDK-8288948</a> (that we back ported into OpenJDK17 based runtime). </div>
</div>
</blockquote>
<br class="">
<div class="">The details can be found at - </div>
<div class=""><a href="https://bugs.openjdk.org/browse/JDK-8288948?focusedCommentId=14504772&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14504772" class="">https://bugs.openjdk.org/browse/JDK-8288948?focusedCommentId=14504772&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-14504772</a></div>
<div class=""><br class="">
</div>
<div class="">Look at the last 3 lines of that comment & attached test results to <a href="https://bugs.openjdk.org/browse/JDK-8288948" class="">https://bugs.openjdk.org/browse/JDK-8288948</a>.</div>
<div class="">In the screenshots for RenderPerf and SwingMark results - the rightmost column header should read “Integrated graphics card."</div>
<br class="">
<blockquote type="cite" class="">
<div class="">
<div style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
<div class=""><br class="">
</div>
<div class="">Best Regards,</div>
<div class="">Alexey<br class="">
<div class=""><br class="">
<blockquote type="cite" class="">
<div class="">On Dec 7, 2022, at 7:22 PM, Philip Race <<a href="mailto:philip.race@oracle.com" class="">philip.race@oracle.com</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div class="">This is clearly too late for JDK 20 and JDK 21 will be just 6 months later so it is a better time for that.<br class="">
FWIW we have just had at a report of a performance drop in JDK 20 from a b07 change to show how it takes<br class="">
time for these things to be discovered.<br class="">
Also I had a bug / rfe for this a while back : <a class="moz-txt-link-freetext" href="https://bugs.openjdk.org/browse/JDK-8233037">
https://bugs.openjdk.org/browse/JDK-8233037</a><br class="">
I closed it as WNF because I wasn't able to see a performance boost.<br class="">
<br class="">
So the right way to do this is to provide some solid evidence of what gets faster and what gets<br class="">
slower with a range of different values (not just the JBR one) and re-open that bug and resolve early in 21.<br class="">
<br class="">
-phil.<br class="">
<br class="">
<br class="">
<div class="moz-cite-prefix">On 12/7/22 7:36 AM, Alexey Ushakov wrote:<br class="">
</div>
<blockquote type="cite" cite="mid:7C1FA120-8A68-4805-A507-7D7ADF6BDBB1@jetbrains.com" class="">
Yes, I confirm that we’ve been using such enlarged buffer for a long time in production. It helped us with scrolling performance on 4K monitors. The suggested property could help to adjust the buffer for the needs of particular application.
<div class=""><br class="">
</div>
<div class="">Best Regards,</div>
<div class="">Alexey<br class="">
<div class=""><br class="">
<blockquote type="cite" class="">
<div class="">On 7 Dec 2022, at 11:37, Laurent Bourgès <<a href="mailto:bourges.laurent@gmail.com" class="moz-txt-link-freetext" moz-do-not-send="true">bourges.laurent@gmail.com</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div dir="auto" class="">Hi,
<div dir="auto" class=""><br class="">
<div dir="auto" class="">For years, JetBrains Runtime uses a larger render queue buffer size (32kb to 6,400,000 bytes) in production, as it boosted many accelerated pipelines: d3d, ogl, metal :</div>
<div dir="auto" class="">~ 10 to 20% on large fills...</div>
<div dir="auto" class=""><br class="">
</div>
<div dir="auto" class="">JBR RenderQueue:</div>
<div dir="auto" class=""><a href="https://urldefense.com/v3/__https://github.com/JetBrains/JetBrainsRuntime/blob/02bc54f8644c6c6467aa952d0a8a104355acc273/src/java.desktop/share/classes/sun/java2d/pipe/RenderQueue.java*L75__;Iw!!ACWV5N9M2RV99hQ!IGt32jobqI206Dm2bA6yJfDrvnugMoQygowL66VIPXfegeFCuprHsXLVNZUDG7C_y1gzas0MW8u8hEEMAjvAoIOFwmNyEA$" class="moz-txt-link-freetext" moz-do-not-send="true">https://github.com/JetBrains/JetBrainsRuntime/blob/02bc54f8644c6c6467aa952d0a8a104355acc273/src/java.desktop/share/classes/sun/java2d/pipe/RenderQueue.java#L75</a><br class="">
</div>
<div dir="auto" class=""><br class="">
</div>
<div dir="auto" class="">JDK RenderQueue:</div>
<div dir="auto" class=""><a href="https://urldefense.com/v3/__https://github.com/bourgesl/jdk-official/blob/5e196b4b8e623107424e2fb54672790fd925fe73/src/java.desktop/share/classes/sun/java2d/pipe/RenderQueue.java*L75__;Iw!!ACWV5N9M2RV99hQ!IGt32jobqI206Dm2bA6yJfDrvnugMoQygowL66VIPXfegeFCuprHsXLVNZUDG7C_y1gzas0MW8u8hEEMAjvAoINZwGQdSw$" class="moz-txt-link-freetext" moz-do-not-send="true">https://github.com/bourgesl/jdk-official/blob/5e196b4b8e623107424e2fb54672790fd925fe73/src/java.desktop/share/classes/sun/java2d/pipe/RenderQueue.java#L75</a><br class="">
</div>
<div dir="auto" class=""><br class="">
</div>
<div dir="auto" class="">I want to propose such quick fix in openjdk20 today, as a 1-line fix.</div>
<div dir="auto" class=""><br class="">
</div>
<div dir="auto" class="">
<table class="">
<tbody class="">
<tr class="">
<td class=""><br class="">
</td>
</tr>
<tr class="">
</tr>
</tbody>
</table>
<table class="">
<tbody class="">
<tr class="">
<td class="">/** The size of the underlying buffer, in bytes. */</td>
</tr>
<tr class="">
</tr>
</tbody>
</table>
<table class="">
<tbody class="">
<tr class="">
<td class="">private static final int BUFFER_SIZE = 6400000;</td>
</tr>
<tr class="">
</tr>
</tbody>
</table>
</div>
<div dir="auto" class=""><br class="">
</div>
<div dir="auto" class="">To ensure a smooth transition, I prefer introducing a new sun.java2d.render.queue system property to increase the default (32kb) buffer capacity:</div>
<div dir="auto" class=""><br class="">
</div>
<div dir="auto" class="">See in marlin:</div>
<div dir="auto" class=""><a href="https://urldefense.com/v3/__https://github.com/bourgesl/marlin-renderer/blob/323f1fb1c72704f5e86c8a13393e30df00888821/src/main/java/sun/java2d/pipe/RenderQueue.java*L78__;Iw!!ACWV5N9M2RV99hQ!IGt32jobqI206Dm2bA6yJfDrvnugMoQygowL66VIPXfegeFCuprHsXLVNZUDG7C_y1gzas0MW8u8hEEMAjvAoIN2g-fa0g$" class="moz-txt-link-freetext" moz-do-not-send="true">https://github.com/bourgesl/marlin-renderer/blob/323f1fb1c72704f5e86c8a13393e30df00888821/src/main/java/sun/java2d/pipe/RenderQueue.java#L78</a><br class="">
</div>
<div dir="auto" class=""><br class="">
</div>
<div dir="auto" class="">So here is my current proposal:</div>
<div dir="auto" class="">[[[</div>
<div dir="auto" class="">
<table class="">
<tbody class="">
<tr class="">
<td class=""><br class="">
</td>
</tr>
<tr class="">
</tr>
</tbody>
</table>
<table class="">
<tbody class="">
<tr class="">
<td class="">/** The size of the underlying buffer, in bytes. */</td>
</tr>
<tr class="">
</tr>
</tbody>
</table>
<table class="">
<tbody class="">
<tr class="">
<td class="">private static final int BUFFER_SIZE;</td>
</tr>
<tr class="">
</tr>
</tbody>
</table>
<table class="">
<tbody class="">
<tr class="">
<td class=""><br class="">
</td>
</tr>
<tr class="">
</tr>
</tbody>
</table>
<table class="">
<tbody class="">
<tr class="">
<td class="">static {</td>
</tr>
<tr class="">
</tr>
</tbody>
</table>
<table class="">
<tbody class="">
<tr class="">
<td class="">// Default 32K is too small for high-end GPU:</td>
</tr>
<tr class="">
</tr>
</tbody>
</table>
<table class="">
<tbody class="">
<tr class="">
<td class="">BUFFER_SIZE = align(getInteger("sun.java2d.render.bufferSize", 32 * 1024, 32 * 1024, 16 * 1024 * 1024), 1024);</td>
</tr>
<tr class="">
</tr>
</tbody>
</table>
<table class="">
<tbody class="">
<tr class="">
<td class=""><br class="">
</td>
</tr>
<tr class="">
</tr>
</tbody>
</table>
<table class="">
<tbody class="">
<tr class="">
<td class="">// System.out.println("RenderQueue: sun.java2d.render.bufferSize = " + BUFFER_SIZE);</td>
</tr>
<tr class="">
</tr>
</tbody>
</table>
<table class="">
<tbody class="">
<tr class="">
<td class="">}</td>
</tr>
<tr class="">
</tr>
</tbody>
</table>
</div>
<div dir="auto" class=""><br class="">
</div>
<div dir="auto" class=""> // system property utilities</div>
<div dir="auto" class=""> public static int getInteger(final String key, final int def,</div>
<div dir="auto" class=""> final int min, final int max)</div>
<div dir="auto" class=""> {</div>
<div dir="auto" class=""> final String property = AccessController.doPrivileged(</div>
<div dir="auto" class=""> new GetPropertyAction(key));</div>
<div dir="auto" class=""><br class="">
</div>
<div dir="auto" class=""> int value = def;</div>
<div dir="auto" class=""> if (property != null) {</div>
<div dir="auto" class=""> try {</div>
<div dir="auto" class=""> value = Integer.decode(property);</div>
<div dir="auto" class=""> } catch (NumberFormatException e) {</div>
<div dir="auto" class=""> System.out.println("Invalid integer value for " + key + " = " + property);</div>
<div dir="auto" class=""> }</div>
<div dir="auto" class=""> }</div>
<div dir="auto" class=""><br class="">
</div>
<div dir="auto" class=""> // check for invalid values</div>
<div dir="auto" class=""> if ((value < min) || (value > max)) {</div>
<div dir="auto" class=""> System.out.println("Invalid value for " + key + " = " + value</div>
<div dir="auto" class=""> + "; expected value in range[" + min + ", " + max + "] !");</div>
<div dir="auto" class=""> value = def;</div>
<div dir="auto" class=""> }</div>
<div dir="auto" class=""> return value;</div>
<div dir="auto" class=""> }</div>
<div dir="auto" class=""><br class="">
</div>
<div dir="auto" class=""> protected static int align(final int val, final int norm) {</div>
<div dir="auto" class=""> final int ceil = (int)Math.ceil( ((float) val) / norm);</div>
<div dir="auto" class=""> return ceil * norm;</div>
<div dir="auto" class=""> }</div>
<div dir="auto" class="">]]]</div>
<div dir="auto" class=""><br class="">
</div>
<div dir="auto" class="">Would you accept such late change for openjdk20 ?</div>
<div dir="auto" class=""><br class="">
</div>
<div dir="auto" class="">Cheers,</div>
<div dir="auto" class="">Laurent Bourgès </div>
</div>
</div>
</div>
</blockquote>
</div>
<br class="">
</div>
</blockquote>
<br class="">
</div>
</div>
</blockquote>
</div>
<br class="">
</div>
</div>
</div>
</blockquote>
</div>
<br class="">
</div>
</div>
</blockquote>
</div>
<br class="">
</div>
</div>
</div>
</blockquote>
</div>
<br class="">
</div>
</body>
</html>