18
takes to install a software package and make it work cannot be ignored if the goal of
software optimization is to save time for the user. With the high complexity of modern
software, it is not unusual for the installation process to take more than an hour. Neither is it
unusual that a user has to reinstall a software package several times in order to find and
resolve compatibility problems.
Software developers should take installation time and compatibility problems into account
when deciding whether to base a software package on a complex framework requiring
many files to be installed.
The installation process should always use standardized installation tools. It should be
possible to select all installation options at the start so that the rest of the installation
process can proceed unattended. Uninstallation should also proceed in a standardized
manner.
3.4 Program loading
Often, it takes more time to load a program than to execute it. The load time can be
annoyingly high for programs that are based on big frameworks and intermediate code, as
is commonly the case with programs written in Java, C#, Visual Basic, etc.
But program loading can be a time-consumer even for programs implemented in compiled
C++. This typically happens if the program uses a lot of runtime DLL's (dynamically linked
libraries, also called shared objects), resource files, configuration files, help files and
databases. The operating system may not load all the modules of a big program when the
program starts up. Some modules may be loaded only when they are needed, or they may
be swapped to the hard disk if the RAM size is insufficient.
The user expects immediate responses to simple actions like a key press or mouse move. It
is unacceptable to the user if such a response is delayed for several seconds because it
requires the loading of modules or resource files from disk. Memory-hungry applications
force the operating system to swap memory to disk. Memory swapping is a frequent cause
of unacceptably long response times to simple things like a mouse move or key press.
Avoid an excessive number of DLLs, configuration files, resource files, help files etc.
scattered around on the hard disk. A few files, preferably in the same directory as the .exe
file, is acceptable.
3.5 Dynamic linking and position-independent code
Function libraries can be implemented either as static link libraries (*.lib, *.a) or dynamic
link libraries, also called shared objects (*.dll, *.so). The mechanism of static linking is
that the linker extracts the functions that are needed from the library file and copies them
into the executable file. Only the executable file needs to be distributed to the end user.
Dynamic linking works differently. The link to a function in a dynamic library is resolved at
run time. Therefore, both the executable file and one or more DLLs are loaded into memory
when the program is run. Both the executable file and all the DLLs need to be distributed to
the end user.
The advantages of using static linking rather than dynamic linking are:
Static linking includes only the part of the library that is actually needed by the
application, while dynamic linking makes the entire library load into memory, possibly
including hundreds of unused functions.