On Thu, 30 May 2024 13:50:33 GMT, Jan Lahoda <jlah...@openjdk.org> wrote:
> Consider these two programs: > > > public class SystemPrint { > public static void main(String... args) { > System.err.println("Hello!"); > } > } > > and: > > public class IOPrint { > public static void main(String... args) { > java.io.IO.println("Hello!"); > } > } > > > They do the same conceptual thing - write a text to the output. But, > `IO.println` delegates to `Console.println`, which then delegates to a > `Console` backend, and the default backend is currently based on JLine. > > The issues is that JLine takes a quite a long time to initialize, and in a > program like this, JLine is not really needed - it is used to provide better > editing experience when reading input, but there's no reading in these > programs. > > For example, on my computer: > > $ time java -classpath /tmp SystemPrint > Hello! > > real 0m0,035s > user 0m0,019s > sys 0m0,019s > > $ time java -classpath /tmp --enable-preview IOPrint > Hello! > > real 0m0,165s > user 0m0,324s > sys 0m0,042s > > > The proposal herein is to delegate to the simpler `Console` backend from > `java.base` as long as the user only uses methods that print to output, and > switch to the JLine delegate when other methods (typically input) is used. > Note that while technically `writer()` is a method doing output, it will > force JLine initialization to avoid possible problems if the client caches > the writer and uses it after switching the delegates. > > With this patch, I can get timing like this: > > $ time java --enable-preview -classpath /tmp/ IOPrint > Hello! > > real 0m0,051s > user 0m0,038s > sys 0m0,020s > > > which seems much more acceptable. > > There is also #19467, which may reduce the time further. > > A future work might focus on making JLine initialize faster, but avoiding > JLine initialization in case where we don't need it seems like a good step to > me in any case. This pull request has now been integrated. Changeset: f7dbb98f Author: Jan Lahoda <jlah...@openjdk.org> URL: https://git.openjdk.org/jdk/commit/f7dbb98fe69eb98f8544577d81550b4fd817864b Stats: 226 lines in 2 files changed: 213 ins; 1 del; 12 mod 8333086: Using Console.println is unnecessarily slow due to JLine initalization Reviewed-by: asotona, naoto ------------- PR: https://git.openjdk.org/jdk/pull/19479