# Script Performance

To maximize performance, avoid using SetFormat (except the fast mode) and include the following lines near the top of each script:

    #NoEnv
    SetBatchLines -1
    ListLines Off

In addition, the following commands may also affect performance depending on the nature of the script: SendMode, SetKeyDelay, SetMouseDelay, SetWinDelay, SetControlDelay, and SetDefaultMouseSpeed.

## Built-in Performance Features

Each script is semi-compiled while it is being loaded and syntax-checked. In addition to reducing the memory consumed by the script, this also greatly improves runtime performance.

Here are the technical details of the optimization process (semi-compiling):

- Input and output variables (when their names don't contain references to other variables) and group names are resolved to memory addresses.
- Loops, blocks, IFs, and ELSEs are given the memory addresses of their related jump-points in the script.
- The destination of each Hotkey, Gosub, and Goto is resolved to a memory address unless it is a variable.
- Each command name is replaced by an address in a jump table.
- Each line is pre-parsed into a list of parameters, and each parameter is pre-parsed into a list of variables (if any).
- Each expression is tokenized and converted from infix to postfix.
- Each reference to a variable or function is resolved to a memory address.
- Literal integers in expressions and math/comparison commands are replaced with binary integers.

In addition, during script execution, binary numbers are cached in variables to avoid conversions to/from strings. See SetFormat for details.