Maximum Number of Operations

In Rhai, it is trivial to construct infinite loops, or scripts that run for a very long time.

loop { ... }                        // infinite loop

while 1 < 2 { ... }                 // loop with always-true condition

Rhai by default does not limit how much time or CPU a script consumes.

This can be changed via the Engine::set_max_operations method, with zero being unlimited (the default).

The operations count is intended to be a very course-grained measurement of the amount of CPU that a script has consumed, allowing the system to impose a hard upper limit on computing resources.

A script exceeding the maximum operations count terminates with an error result. This can be disabled via the unchecked feature for higher performance (but higher risks as well).

let mut engine = Engine::new();

engine.set_max_operations(500);     // allow only up to 500 operations for this script

engine.set_max_operations(0);       // allow unlimited operations

TL;DR – What does one operation mean?

The concept of one single operation in Rhai is volatile – it roughly equals one expression node, loading one variable/constant, one operator call, one iteration of a loop, or one function call etc. with sub-expressions, statements and function calls executed inside these contexts accumulated on top.

A good rule-of-thumb is that one simple non-trivial expression consumes on average 5-10 operations.

One operation can take an unspecified amount of time and real CPU cycles, depending on the particulars. For example, loading a constant consumes very few CPU cycles, while calling an external Rust function, though also counted as only one operation, may consume much more computing resources.

To help visualize, think of an operation as roughly equals to one instruction of a hypothetical CPU which includes specialized instructions, such as function call, load module etc., each taking up one CPU cycle to execute.