<div dir="ltr"><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Feb 7, 2019 at 9:39 PM Elana Hashman <<a href="mailto:ehashman@debian.org">ehashman@debian.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Tue, Feb 05, 2019 at 11:42:32PM -0600, Alex Miller wrote:<br>
> <br>
> Some things I would look at:<br>
> <br>
> - Try with -Dclojure.spec.skip-macros=true to see if any difference<br>
>   (skips spec macro checking which could possibly affect startup time)<br>
<br>
Is this a runtime or build arugment? </blockquote><div><br></div><div>It is a compiler flag (really used during macroexpansion specifically) but compilation happens any time you are compiling code, which can be at runtime, depending what that means.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I can't find this documented<br>
anywhere except in this commit[0].<br>
<br>
[0]: <a href="https://github.com/clojure/clojure/commit/3d9b356306db77946bdf4809baeb660f94cec846" rel="noreferrer" target="_blank">https://github.com/clojure/clojure/commit/3d9b356306db77946bdf4809baeb660f94cec846</a></blockquote><div><br></div><div>At the moment, only here: </div><div><a href="https://clojure.org/guides/faq#skip_macros">https://clojure.org/guides/faq#skip_macros</a><br></div><div><br></div><div>But there will be a spec reference page eventually which is where it will go.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">> - Check that you're actually using AOT'ed Clojure. In the clojure jar<br>
>   file, typically you'll see both .class and .clj files. The timestamps<br>
>   matter! If the .clj is newer than the .class files, it will use the<br>
>   .clj and recompile. I have certainly seen people run into this kind of<br>
>   problem with builds that don't retain timestamps properly for whatever<br>
>   reason (the Maven shade plugin is a notorious culprit, but we don't<br>
>   use that in the Clojure build).<br>
<br>
So I think I found one fishy looking thing: while clojure.jar's<br>
timestamps are all fine, it appears that the core.specs.alpha and<br>
spec.alpha jars have .clj files with identical timestamps to the source<br>
files, which may be affecting things. Ditto clojure1.8, etc. I believe<br>
this is due to Debian's reproducible build steps.<br></blockquote><div><br></div><div>If timestamps are identical, Clojure will recompile (that is .class is used only if newer, not same, than .clj file).</div><div><br></div><div>We intentionally don't compile or distribute classes in the core.specs.alpha artifact so that the spec instances are not tied to a specific version of spec.alpha (which can be updated independently from clojure). So that artifact should be source only (.clj), no .classes.</div><div><br></div><div>How are these things built? Are they using the same process we use to create the official artifacts? If not, why not? It disturbs me that these are alternate, potentially bad, versions of things we publish officially.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">However, that doesn't explain the massive slowdown between JDK8 and<br>
JDK11 for all Clojure jars, 1.8 included.<br>
<br>
elana@debian:/debian/clojure$ time /usr/lib/jvm/java-8-openjdk-amd64/bin/java -cp /usr/share/java/clojure-1.8.jar clojure.main -e '"hi"'<br>
"hi"<br>
<br>
real    0m4.368s<br>
user    0m13.633s<br>
sys     0m0.360s<br>
<br>
elana@debian:/debian/clojure$ time /usr/lib/jvm/java-8-openjdk-amd64/bin/java -cp /usr/share/java/clojure-1.8.jar clojure.main -e '"hi"'<br>
"hi"<br>
<br>
real    0m3.941s<br>
user    0m13.516s<br>
sys     0m0.356s<br>
<br>
elana@debian:/debian/clojure$ time /usr/lib/jvm/java-11-openjdk-amd64/bin/java -cp /usr/share/java/clojure-1.8.jar clojure.main -e '"hi"'<br>
"hi"<br>
<br>
real    0m9.962s<br>
user    0m24.804s<br>
sys     0m0.507s<br>
<br>
elana@debian:/debian/clojure$ time /usr/lib/jvm/java-11-openjdk-amd64/bin/java -cp /usr/share/java/clojure-1.8.jar clojure.main -e '"hi"'<br>
"hi"<br>
<br>
real    0m10.040s<br>
user    0m26.233s<br>
sys     0m0.586s<br>
<br>
<br>
I'm finding this utterly baffling.<br>
<br>
For comparison, on the same machine I downloaded the official 1.8<br>
release, and it's not seeing the same performance issues:<br>
<br>
elana@debian:/tmp$ time /usr/lib/jvm/java-11-openjdk-amd64/bin/java -cp clojure-1.8.0.jar clojure.main -e '"hi"'<br>
"hi"<br>
<br>
real    0m1.377s<br>
user    0m2.652s<br>
sys     0m0.155s<br>
elana@debian:/tmp$ time /usr/lib/jvm/java-8-openjdk-amd64/bin/java -cp clojure-1.8.0.jar clojure.main -e '"hi"'<br>
"hi"<br>
<br>
real    0m1.232s<br>
user    0m2.048s<br>
sys     0m0.124s<br>
<br>
<br>
Another data point: clj 1.10 linked with the Debian core.specs.alpha and<br>
spec.alpha:<br>
<br>
elana@debian:/tmp$ time /usr/lib/jvm/java-8-openjdk-amd64/bin/java -cp clojure-1.10.0.jar:/usr/share/maven-repo/org/clojure/spec.alpha/debian/spec.alpha-debian.jar:/usr/share/maven-repo/org/clojure/core.specs.alpha/debian/core.specs.alpha-debian.jar clojure.main -e '"hi"'<br>
"hi"<br>
<br>
real    0m2.761s<br>
user    0m7.836s<br>
sys     0m0.317s<br>
elana@debian:/tmp$ time /usr/lib/jvm/java-11-openjdk-amd64/bin/java -cp clojure-1.10.0.jar:/usr/share/maven-repo/org/clojure/spec.alpha/debian/spec.alpha-debian.jar:/usr/share/maven-repo/org/clojure/core.specs.alpha/debian/core.specs.alpha-debian.jar clojure.main -e '"hi"'<br>
"hi"<br>
<br>
real    0m4.363s<br>
user    0m14.337s<br>
sys     0m0.381s<br>
<br>
vs. upstream specs, which it is faster with:<br>
<br>
elana@debian:/tmp$ time /usr/lib/jvm/java-11-openjdk-amd64/bin/java -cp clojure-1.10.0.jar:core.specs.alpha-0.2.44.jar:spec.alpha-0.2.176.jar clojure.main -e '"hi"'<br>
"hi"<br>
<br>
real    0m1.688s<br>
user    0m3.741s<br>
sys     0m0.173s<br>
elana@debian:/tmp$ time /usr/lib/jvm/java-8-openjdk-amd64/bin/java -cp clojure-1.10.0.jar:core.specs.alpha-0.2.44.jar:spec.alpha-0.2.176.jar clojure.main -e '"hi"'<br>
"hi"<br>
<br>
real    0m1.446s<br>
user    0m2.752s<br>
sys     0m0.166s<br>
<br>
<br>
This strongly suggests to me that something different happening in the<br>
Debian build process is causing a performance degradation.<br></blockquote><div><br></div><div>I concur.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Debian's up-to-date core.specs.alpha and spec.alpha are in the archive,<br>
but in case anyone wants to poke around with the guts of the jars I<br>
built/are installed in the archive[1].<br>
<br>
Note that the terrible performance times I'm seeing here look similar to<br>
what Rob reported when we had an issue with reproducible builds<br>
affecting Clojure performance[2].<br></blockquote><div><br></div><div>I think it's almost certainly this issue with clj / class timestamps. afaik, nothing was ever filed about this in the Clojure ticket system. </div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
- e<br>
<br>
[1]: <a href="https://csclub.uwaterloo.ca/~ehashman/debian/clojure/" rel="noreferrer" target="_blank">https://csclub.uwaterloo.ca/~ehashman/debian/clojure/</a><br>
[2]: <a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877418" rel="noreferrer" target="_blank">https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877418</a><br>
</blockquote></div></div></div>