## Performance Tuning

Some operations in Argyll can be particularly slow, so it is worth examining ways of improving performance, or trading memory consumption for performance.

### Creating Device Links and Profiles

In creating device links or the B2A tables of profiles, the execution time is often dominated by the inversion of forward color lookup values. An in-memory cache is employed to speed up this operation, by keeping computed values in case they can be used more than once. The amount of memory used for caching these values is pre-set within the inversion code, and by default is set to use half of the available RAM on the system, with a minimum of 50 Mbytes.
The reverse cache size can be changed by setting an environment variable ARGYLL_REV_CACHE_MULT to a number greater or less than than 1.0 This will multiply the size of the cache by that number (i.e. 1.5 would increase the cache size by 50%, 0.5 would halve it).
If you find that colprof or collink are working very slowly, but that your CPU's are nearly idle, then this is a sign of disk swapping, and that too much memory is being requested. This can be because other applications are also using memory, or Argyll's default setting tries to use more memory than is actually available. You can try shutting down other applications when this happens, or you can lower the amount of memory Argyll uses by setting ARGYLL_REV_CACHE_MULT to a value less than 1.0 (ie. try 0.5).
If you have a lot of memory available, you can try increasing the cache size to use more of the available RAM (particularly if you get a "Warning - Reverse Cell Cache exhausted, processing in chunks" message during processing), but if you set it to a value too near 2.0 you risk disk swapping, which can slow progress to a crawl.
If you have a lot of memory available, then a second adjustment that can make a great difference to the time taken in creating B2A tables is the resolution of the inverse lookup acceleration grid. The finer the grid, the less searching is needed to locate the input colorspace values that correspond to a target output color value, but the greater the memory used in this structure, and the greater the setup time needed to initialize the acceleration grid. The ARGYLL_REV_ACC_GRID_RES_MULT environment variable can alter the default resolution by a scale factor. A value of 0.5 for instance, would halve the resolution (typically meaning 1/8 th. the total number of grid entries and memory), while a value of 2.0 would double it, typically resulting in 8 times the memory usage. Increasing the resolution too much will reduce the available memory for the reverse cache, and greatly increase setup time.

### Setting an environment variable:

To set an environment variable an MSWindows DOS shell, either use set, e.g.;
set ARGYLL_REV_CACHE_MULT=1.5
which will set the value for that session, or set it in
Control Panel->System->Advanced->Environment Variables..
in either user or system variables.
You can examine individual variables using
echo %VARIABLE_NAME%
or see all of them using
set
For OS X or Linux, the exact procedure will depend on the shell you are running, but
is usually something like:
export ARGYLL_REV_CACHE_MULT=1.5
or
set ARGYLL_REV_CACHE_MULT=1.5
or
ARGYLL_REV_CACHE_MULT=1.5
and may need separately exporting, something like:
export ARGYLL_REV_CACHE_MULT
Generally it should be configured in the shell start-up script, if you want the setting to be used
for every session.
You can examine individual variables using
echo $VARIABLE_NAME
or see all of them using
set