Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8219233

3x performance drop for some Clojure applications

    Details

    • Subcomponent:
    • Understanding:
      Fix Understood
    • Introduced In Build:
      b01
    • Introduced In Version:
    • CPU:
      generic
    • OS:
      generic

      Description

      ADDITIONAL SYSTEM INFORMATION :
      Mac OS X 10.13.6 on 2018 Macbook Pro

      A DESCRIPTION OF THE PROBLEM :
      I am part of the Clojure core team. I have received at least 4 reports in the last day of significantly degraded performance for Clojure when using the latest Java 1.8 and 11 releases (1.8.0_201 and 11.0.2) vs the prior releases (1.8.0_192 and 11.0.1), with no other changes.

      REGRESSION : Last worked in version 11.0.1

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      You can find a reproducible case at https://github.com/hiredman/weird-user-load-performance.

      1) Install the Clojure clj dependency manager / runner (see https://clojure.org/guides/getting_started)
      2) Clone the repo https://github.com/hiredman/weird-user-load-performance.git
      3) cd weird-user-load-performance
      4) clj -A:user

      clj is used basically just to download the dependency jars from Maven, form the classpath, and start the Clojure runtime to run a script, which just loads a Clojure namespace (and subsequently all downstream namespaces). The "work" happening here is loading .clj files from jar files on the classpath, running the compiler, generating bytecode, and loading it in a classloader.

      The first run of clj will download all of the transitive deps so that run should be discarded. All subsequent runs should use the cached jars in ~/.m2/repository and a cached classpath, so should not use the network.

      This is a narrowed down use case from a more complicated library, but one aspect that seems to aggravate things is that there is very macro-heavy code, which is single-thread CPU-intensive.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      The program will print a timing of loading the namespaces. The expected result is that the performance is approximately the same in 1.8.0_192 vs 1.8.0_201 or 11.0.1 vs 11.0.2.
      ACTUAL -
      1.8.0_192: 2834.550371 msecs
      1.8.0_201: 9545.118397 msecs (3.3x performance degradation)

      11.0.1: 2945.72692 msecs
      11.0.2: 10817.427187 msecs (3.7x performance degradation)

      ---------- BEGIN SOURCE ----------
      Unfortunately, I have been unable to narrow this down enough to be able to reproduce it in a Java-only environment. The Clojure source files are at the root of the repo - there are only 3 lines of Clojure code that just trigger a lot of compilation. I am hoping there is enough information or that this report can be combined with others to discover the cause.
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      Clojure users are currently downgrading to the prior version to avoid the issue.

      FREQUENCY : always


        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                vlivanov Vladimir Ivanov
                Reporter:
                webbuggrp Webbug Group
              • Votes:
                0 Vote for this issue
                Watchers:
                13 Start watching this issue

                Dates

                • Created:
                  Updated: