Profiling ​
Compiling oxlint
in release mode with debug information ​
For profiling, you will need to compile the oxlint
binary in release mode with debug information enabled. You can do that by passing --profile release-with-debug
to cargo build
:
cargo build --profile release-with-debug --bin oxlint
After building, the binary is located at ./target/release-with-debug/oxlint
. This is the binary that should be used for profiling.
CPU - Samply ​
Samply is a command line CPU profiler which uses the Firefox profiler as its UI. Works on macOS and Linux.
To use Samply with oxlint
, run samply record
followed by the oxlint
command and arguments:
samply record ./target/release-with-debug/oxlint .
To improve the profiling experience, you might consider some of the following options:
oxlint
:--silent
will suppress diagnostics output and keep the profile more focused.oxlint
:--threads 1
will run the linter single threaded, which is slower, but makes it easier to analyze the profile for single-threaded performance.samply record
:--rate <number>
will sample the profile at a higher rate. The default is 1000Hz (1ms), but increasing this will provide more detailed information at the cost of a larger profile file.
For example, running oxlint
single-threaded with a 0.1ms sample rate:
samply record --rate 10000 ./target/release-with-debug/oxlint --silent --threads 1 .
CPU - Mac Xcode Instruments ​
cargo instruments
is the tool of choice to bridge Mac Xcode instruments.
The following instruction replicates the procedure of cargo instruments
.
First, install Xcode Instruments command-line tools:
xcode-select --install
Then, if you haven't already, ensure that the oxlint
binary is compiled.
Under the hood, cargo instruments
invokes the xcrun xctrace
command, which is equivalent to
xcrun xctrace record --template 'Time Profile' --output . --launch -- /path/to/oxc/target/release-with-debug/oxlint
Running the command above produces the following output
Starting recording with the Time Profiler template. Launching process: oxlint.
Ctrl-C to stop the recording
Target app exited, ending recording...
Recording completed. Saving output file...
Output file saved as: Launch_oxlint_2023-09-03_4.41.45 PM_EB179B85.trace
Open the trace file open Launch_oxlint_2023-09-03_4.41.45\ PM_EB179B85.trace
.
To see a top down trace:
- On the top panel, click CPUs
- On the left input box, click
x
then selectTime Profiler
- At the bottom panel, click "Call Tree", turn on "Invert Call Tree" and turn off separate by thread.
For memory and disk operations, use --template 'Allocations'
and --template 'File Activity'
.
For more detailed CPU profiling, such as L1/L2 cache misses, cycle and instruction counts, and branch prediction info, you need to use a custom "CPU Counters" template:
- Open Instruments and select the "CPU Counters" template.
- In the "CPU Counters" settings:
- Turn on the "High Frequency Sampling" option.
- Below the "High Frequency Sampling" option, click the plus icon and select an event type. Some suggested event types:
- Cycles - for getting a rough idea of how many CPU cycles are spent in each function.
- Instructions - for getting a rough idea of how many CPU instructions are executed in each function and how many cycles that takes
L1D_CACHE_MISS_LD
- count of L1 cache misses from loading data from memory
- Once you have enabled the events you are interested in, save the template in "File > Save as Template ..." and give it a name.
- Now you can use this with
xctrace
by passing the template name to the--template
option:xcrun xctrace record --template 'My Custom CPU Counters' --output . --launch -- /path/to/oxc/target/release-with-debug/oxlint
Heap Allocation ​
Try dhat.