@garyv, I haven't tested/profiled in a really long time, but I recall the
majority of startup time being spent in Class.forName.  I'm not sure how to
verify startup exactly, but it should be easy to profile a top-level repl
'require' call from the user ns, which is doing essentially the same work,
except it wouldn't show the difference between direct-linked code and
nondirect, and you'd have to be careful to AOT your project so you're not
just profiling the compiler.

On Wed, Jan 24, 2018 at 8:39 AM Gary Verhaegen <gary.verhae...@gmail.com>
wrote:

> I've read a mot of discussions around that but have never myself looked
> into the details, so the following may be completely wrong.
>
> My understanding is slightly different: the JVM does not actually load a
> class before it is first accessed by running code. What takes a long time
> for the JVM and not for JS engines, I think, is not loading the code, but
> creating objects.
>
> For Clojure to run, all of your functions need to exist as objects in
> memory. Java bytecode does not have any mechanism to describe objects, so
> when Clojure starts up, it has to first load the code that defines the
> classes, then load the code that creates instances of those classes, and
> then execute that code to actually get the function objects. Only then can
> it start even thinking about looking at your own code. AOT thus just saves
> on parsing string files into Clojure lists, but it cannot really help with
> the problem that all of these objects still have to be created again from
> scratch at each start up.
>
> The javascript engines have a way of representing objects directly (aka
> json), so this is much less of a problem: a lot of that object creation can
> be done at compile time and the js engine can just load objects in memory
> directly from the js file. You can go further (like Lumo does) by
> preloading these objects in memory directly as part of the executable
> bundle, skipping the part where you need to parse a string.
>
> So in my understanding it mostly boils down to the ability to define
> objects directly, so they can just be loaded in memory, versus having to
> load and execute code to create the objects.
>
> On 24 Jan 2018, at 09:09, Didier <didi...@gmail.com> wrote:
>
> So if that is true, then the slow startup times are to blame on Java. I
> understand that Clojure does a lot of extra stuff at startup that a plain
> Java main method would not, but those extra things Clojure does are slow,
> because of the way the JVM handles them, where as they are quite fast on V8
> or other JavaScript engines.
>
> On Friday, 14 July 2017 16:24:33 UTC-7, Gary Trakhman wrote:
>>
>> My mental model explains most of this away due to the different load
>> patterns of java vs v8.  In JVM clojure, functions are essentially 1:1 with
>> classes, so in a functional language and standard lib, that's a lot of
>> classes.  Java will eagerly classload your entire app and deps before doing
>> any work.  V8 takes an upfront hit on parsing into javascript, but the JS
>> target fits the structure of clojure itself much more closely.  More time
>> (not sure how much compared to JVM) will be spent JITing hot code paths,
>> but that won't show up in the startup cost.
>>
>> You can get JVM clojure REPL startup a little faster by AOT compiling all
>> your deps, but it's generally not worth it in a development flow.
>>
>> I think lumo does some extra tricks to keep this upfront cost down that
>> are v8-specific:
>> https://anmonteiro.com/2016/11/the-fastest-clojure-repl-in-the-world/
>>
>> On Fri, Jul 14, 2017 at 6:20 PM Didier <did...@gmail.com> wrote:
>>
>>> This link:
>>> https://dev.clojure.org/display/design/Improving+Clojure+Start+Time says
>>> that the Java startup time is ~94 ms, while Clojure boot time is ~640
>>> ms. That's a ~680% increase.
>>>
>>> On my machine the java start time is: ~1042 ms, and the Clojure start
>>> time is around ~3108 ms. A ~298% increase.
>>>
>>> When I time the startup time of lumo against node, I get ~1190 ms for
>>> node, and ~1523 ms for lumo. A ~128% increase only.
>>>
>>> Does Clojure perform more initialization then ClojureScript? And would
>>> that explain the much higher overhead Clojure has on top of the JVM, versus
>>> ClojureScript?
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To post to this group, send email to clo...@googlegroups.com
>>> Note that posts from new members are moderated - please be patient with
>>> your first post.
>>> To unsubscribe from this group, send email to
>>> clojure+u...@googlegroups.com
>>> For more options, visit this group at
>>> http://groups.google.com/group/clojure?hl=en
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to clojure+u...@googlegroups.com.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to