Import 2017-06-07 23:51:09: master d49b8c36

Author Committer Branch Timestamp Parent
jcfr jcfr master 2016-05-18 19:36:00 master 136ad663

PERF: Improve startup time delaying execution of shared and executable CLIs

This commit reduces startup time by 0000030:0000050% (8.6s -> 5.5s). Detailed startup
time stats reported below.

[ci skip]

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

git-svn-id: 3bd1e089-480b-0410-8dfb-8563597acbee

mod - Base/QTCLI/qSlicerCLIExecutableModuleFactory.cxx Diff File
mod - Base/QTCLI/qSlicerCLIExecutableModuleFactory.h Diff File
mod - Base/QTCLI/qSlicerCLILoadableModuleFactory.cxx Diff File
mod - Base/QTCLI/qSlicerCLILoadableModuleFactory.h Diff File
mod - SuperBuild/External_SlicerExecutionModel.cmake Diff File