When users have many extensions that need to be loaded, developers of SketchUp extensions can help the startup cycle by using conditional
Since (at least) the SketchUp 2016 release, the
"Tools" folder files have been loaded first before any of the files in the
"Plugins" folder. This means that
"sketchup.rb" are likely already loaded (in this order) by the time any extension begins loading.
If your extension files use plain
require statements to ensure that these files are loaded, then SketchUp’s Ruby has to do slow string comparison of the script name argument against every path member in the
$LOADED_FEATURES array, each and everytime a non-conditional
require statement is executed.
Your code files can instaed use conditional modifiers to only execute the
require statements when necessary.
Example of a set of plain
require statements used by many extension authors:
require 'sketchup.rb' # internally calls "require 'langhandler.rb'" require 'extensions.rb' require 'langhandler.rb' # frivolous
Example of conditional
require 'sketchup.rb' unless Object.private_method_defined?(:file_loaded) require 'extensions.rb' unless defined?(SketchupExtension) require 'langhandler.rb' unless defined?(LanguageHandler)
If you prefer
if not rather than
unless that will also work fine.
The point is that testing for class and method object existence is way faster than comparing a substring against a growing list of absolute path strings (in the
The same sort of thing can be used with an extension that has multiple files to load at startup, if the files are not encrypted or scrambled.
If an extension has an internal indicator of whether it is loading for the first time (ie. an
@@loaded variable?,) then
Kernel#load could be used instead.
if not @@loaded load 'main.rb' load 'commands.rb' load 'menus.rb' end
Now if we could also get
Sketchup::require changed so that it will skip the
$LOADED_FEATURES comparison during the startup cycle, and just load files (similar to a
Kernel#load call,) then startups could get considerably faster.
If ALL extensions used conditional
require statements then the startup cycle would be faster for those users who load many plugins.