blob: 262f46274cc0e2fcca74e5e5c0e6a1400a33b3fc [file] [log] [blame] [view]
# mojo_benchmark
`mojo_benchmark` allows you to run performance tests for any Mojo application
that participates in the [tracing
ecosystem](https://github.com/domokit/mojo/blob/master/mojo/services/tracing/interfaces/tracing.mojom)
with no app changes required.
The script reads a list of benchmarks to run from a file, runs each benchmark in
controlled caching conditions with tracing enabled and performs specified
measurements on the collected trace data.
## Defining benchmarks
`mojo_benchmark` runs performance tests defined in a benchmark file. The
benchmark file is a Python dictionary of the following format:
```python
benchmarks = [
{
'name': '<name of the benchmark>',
'app': '<url of the app to benchmark>',
'shell-args': [],
'duration': <duration in seconds>,
# List of measurements to make.
'measurements': [
'<measurement type>/<event category>/<event name>',
],
},
]
```
The following types of measurements are available:
- `time_until` - measures time until the first occurence of the specified event
- `avg_duration` - measures the average duration of all instances of the
specified event
## Caching
The script runs each benchmark twice. The first run (**cold start**) clears
caches of the following apps on startup:
- network_service.mojo
- url_response_disk_cache.mojo
The second run (**warm start**) runs immediately afterwards, without clearing
any caches.
## Time origin
The underlying benchmark runner records the time origin just before issuing the
connection call to the application being benchmarked. Results of `time_until`
measurements are relative to this time.
## Example
For an app that records a trace event named "initialized" in category "my_app"
once its initialization is complete, we can benchmark the initialization time of
the app (from the moment someone tries to connect to it to the app completing
its initialization) using the following benchmark file:
```python
benchmarks = [
{
'name': 'My app initialization',
'app': 'https://my_domain/my_app.mojo',
'duration': 10,
'measurements': [
'time_until/my_app/initialized',
],
},
]
```