basilisp icon indicating copy to clipboard operation
basilisp copied to clipboard

Delayed loading for lesser-used Core features

Open chrisrink10 opened this issue 5 years ago • 0 comments

As of this writing, startup Basilisp up locally takes just over 4 seconds without a locally cached copy:

$ BASILISP_USE_DEV_LOGGER=true BASILISP_LOGGING_LEVEL=DEBUG BASILISP_DO_NOT_CACHE_NAMESPACES=true basilisp repl
2019-05-06 08:33:46,726 DEBUG [basilisp.lang.runtime.init_ns_var:1269] - Created namespace variable basilisp.core/*ns*
2019-05-06 08:33:46,727 DEBUG [basilisp.importer.find_spec:128] - Found potential Basilisp module 'basilisp.core' in file '/Users/christopher/Projects/basilisp/src/basilisp/core/__init__.lpy'
2019-05-06 08:33:46,727 DEBUG [basilisp.importer.create_module:166] - Creating Basilisp module 'basilisp.core''
2019-05-06 08:33:46,727 DEBUG [basilisp.lang.runtime.set_current_ns:1289] - Setting basilisp.core/*ns* to basilisp.core
2019-05-06 08:33:46,727 DEBUG [basilisp.importer._exec_module:227] - Reading and compiling Basilisp module 'basilisp.core'
2019-05-06 08:33:51,098 DEBUG [basilisp.importer.<lambda>:216] - Loaded Basilisp module 'basilisp.core' in 4370.760615ms
2019-05-06 08:33:51,109 DEBUG [basilisp.importer.find_spec:128] - Found potential Basilisp module 'basilisp.repl' in file '/Users/christopher/Projects/basilisp/src/basilisp/repl.lpy'
2019-05-06 08:33:51,109 DEBUG [basilisp.importer.create_module:166] - Creating Basilisp module 'basilisp.repl''
2019-05-06 08:33:51,110 DEBUG [basilisp.lang.runtime.set_current_ns:1289] - Setting basilisp.core/*ns* to basilisp.repl
2019-05-06 08:33:51,110 DEBUG [basilisp.importer._exec_module:227] - Reading and compiling Basilisp module 'basilisp.repl'
2019-05-06 08:33:51,190 DEBUG [basilisp.importer.<lambda>:216] - Loaded Basilisp module 'basilisp.repl' in 80.048895ms
2019-05-06 08:33:51,191 DEBUG [basilisp.lang.compiler.generator.__init__:200] - Compiler option warn_on_shadowed_name=False
2019-05-06 08:33:51,191 DEBUG [basilisp.lang.compiler.generator.__init__:200] - Compiler option warn_on_var_indirection=True
2019-05-06 08:33:51,191 DEBUG [basilisp.lang.compiler.generator.__init__:200] - Compiler option warn_on_shadowed_var=False
2019-05-06 08:33:51,191 DEBUG [basilisp.lang.compiler.generator.__init__:200] - Compiler option use_var_indirection=False
2019-05-06 08:33:51,191 DEBUG [basilisp.lang.runtime.set_current_ns:1289] - Setting basilisp.core/*ns* to user

I was thinking about some options to help reduce that load time for the average use case. For a lot of users, they may not use some of the more esoteric bits of basilisp.core, so it may make sense to potentially JIT load them.

We could potentially def all the Vars with a JIT-loader that will fetch and load the contents of a separate file only when that def is called and then swap out the Vars with the "real" version. I think this would probably be doable on the first use of a few of these features, but obviously we will need to make sure that they are features which exist largely in isolation in basilisp.core, because if they are called later from within core they will reintroduce the loading time (and add to it).

chrisrink10 avatar May 06 '19 12:05 chrisrink10