rhai/doc/src/start/builds/performance.md
2020-09-19 12:14:02 +08:00

2.3 KiB

Performance Build

{{#include ../../links.md}}

Some features are for performance. For example, using [only_i32] or [only_i64] disables all other integer types (such as u16).

Use Only One Integer Type

If only a single integer type is needed in scripts - most of the time this is the case - it is best to avoid registering lots of functions related to other integer types that will never be used. As a result, [Engine] creation will be faster because fewer functions need to be loaded.

The [only_i32] and [only_i64] features disable all integer types except i32 or i64 respectively.

Use Only 32-Bit Numbers

If only 32-bit integers are needed - again, most of the time this is the case - turn on [only_i32]. Under this feature, only i32 is supported as a built-in integer type and no others.

On 64-bit targets this may not gain much, but on certain 32-bit targets this improves performance due to 64-bit arithmetic requiring more CPU cycles to complete.

Minimize Size of Dynamic

Turning on [no_float] and [only_i32] on 32-bit targets makes the critical [Dynamic] data type only 8 bytes long. Normally [Dynamic] can be up to 16 bytes (e.g. on x86/x64 CPU's) in order to hold an i64 or f64.

A small [Dynamic] helps performance due to better cache efficiency.

Use ImmutableString

Internally, Rhai uses immutable [strings] instead of the Rust String type. This is mainly to avoid excessive cloning when passing function arguments.

Rhai's internal string type is ImmutableString (basically Rc<String> or Arc<String> depending on the [sync] feature). It is cheap to clone, but expensive to modify (a new copy of the string must be made in order to change it).

Therefore, functions taking String parameters should use ImmutableString or &str (both map to ImmutableString) for the best performance with Rhai.

Disable Closures

Support for [closures] that capture shared variables adds material overhead to script evaluation.

This is because every data access must be checked whether it is a shared value and, if so, take a read lock before reading it.

Use [no_closure] to disable closure and capturing support to optimize the hot path because there is no need to take locks for shared data.