Improve startup time
Created by: jcfr
PERF: Improve startup time delaying execution of shared and executable CLIs
This commit reduces startup time by ~50% (8.6s -> 5.5s). Detailed startup time stats reported below.
More specifically, it updates the loadable and executable CLI factories so that (1) the XML file is directly loaded from disk if it exists along side the executable or library and (2) the execution of the executable or "entry point" for shared library is delayed until needed.
For CLI executable, change consists simply in reading the XML file if it exists and postpone the execution until it is needed.
For CLI shared library, the ModuleDescription object API has been updated. It now allows the association of a callback in charge of loading the library and resolving symbols. The callback is automatically called when "GetTarget()" method is called and no target has already been set.
Note that the XML file is now copied (and installed if it applies) along side the CLI executable. There are currently no option to avoid the new behavior, if it reveals problematic, we could revisit and introduce an option for "SEMMacroBuildCLI" macro.
Detailed startup time stats without this change are reported in precedent commit (ENH: Add convenience script to measure the application startup time).
Detailed startup time stats after this change:
- Obtained on Ubuntu 15.10, 64GB/M.2 PCIe NVMe SSD/Quad Core 3.80GHz.
- For a release build
Slicer --no-splash --exit-after-startup
5.537 seconds
Slicer --no-splash --exit-after-startup --disable-builtin-cli-modules
5.438 seconds
Slicer --no-splash --exit-after-startup --disable-builtin-loadable-modules
2.863 seconds
Slicer --no-splash --exit-after-startup --disable-builtin-scripted-loadable-modules
3.925 seconds
Slicer --no-splash --exit-after-startup --disable-builtin-cli-modules --disable-builtin-scripted-loadable-modules
3.973 seconds
Slicer --no-splash --exit-after-startup --disable-modules
1.761 seconds
Slicer --no-splash --exit-after-startup --disable-python
3.094 seconds
Slicer --no-splash --exit-after-startup --disable-python --disable-builtin-cli-modules
3.054 seconds
Slicer --no-splash --exit-after-startup --disable-python --disable-builtin-loadable-modules
0.972 seconds
Slicer --no-splash --exit-after-startup --disable-python --disable-builtin-scripted-loadable-modules
3.135 seconds
Slicer --no-splash --exit-after-startup --disable-python --disable-builtin-cli-modules --disable-builtin-scripted-loadable-modules
3.085 seconds
Slicer --no-splash --exit-after-startup --disable-python --disable-modules
0.924 seconds
SlicerExecutionModel changes:
$ git shortlog b2c78c7..1b2a454 --no-merges
Jean-Christophe Fillion-Robin (9):
STYLE: ModuleDescription: Move definition to cxx file
STYLE: Remove obsolete ModuleFactory class
STYLE: ModuleDescription: Remove unused Alternative Type/Target/Location
STYLE: Remove obsolete BinaryFileDescriptor support
STYLE: ModuleDescriptionParser: Add separator comment, small tweaks
STYLE: Add ModuleDescriptionTesting Macros and Utilities files
STYLE: ModuleDescription: Add TestDefaults
ENH: ModuleDescription: Add support for lazily setting the target
ENH: Update SEMMacroBuildCLI to copy (and optionally install) the XML file