49 lines
1.8 KiB
Markdown
49 lines
1.8 KiB
Markdown
---
|
|
title: "Rust: powf is slow"
|
|
author: "James Pace"
|
|
date: "2024/01/31"
|
|
---
|
|
|
|
I'm currently working on a project in Rust which does a lot of math on
|
|
a microcontroller.
|
|
In Rust, normal math operations (like absolute value and square
|
|
root for floats) are provided as part of the standard library (called `std`),
|
|
which is not available for the microcontroller I'm using.
|
|
Thus, alternate libraries have to be used.
|
|
|
|
The two major ones I've found (and which I need to do a detailed comparison
|
|
of) are [micromath][micromath] and [libm][libm].
|
|
For now, I've been using `libm`, mainly because its the first one I found.
|
|
|
|
One of the operations my project does a lot is find the distance between two points.
|
|
My initial implementation did something like
|
|
```rust
|
|
fn distance(point1: &Point, point2: &Point) -> f32 {
|
|
let squared_dist = libm::powf((point2.x - point1.x), 2.0) + libm::powf((point2.y - point1.y), 2.0);
|
|
sqrt(squared_dist)
|
|
}
|
|
```
|
|
|
|
While doing some profiling, I switched to
|
|
```rust
|
|
fn distance(point1: &Point, point2: &Point) -> f32 {
|
|
let x_dist = point2.x - point1.x;
|
|
let y_dist = point2.y - point1.y;
|
|
|
|
let squared_dist = x_dist*x_dist + y_dist*y_dist;
|
|
libm::sqrt(squared_dist)
|
|
}
|
|
```
|
|
which was significantly faster, especially on the `microbit` I was running the code on for
|
|
profiling.
|
|
|
|
Out of curiousity, I tried doing the same thing, but on my laptop using `std::powf` instead
|
|
of `libm::powf`.
|
|
|
|
When compiling with the default optimization level (`-O3`), I saw a similar performance
|
|
increase, but not when I switched to compiling with `--release`, which I found interesting,
|
|
and which underscores the importance of building in `--release` which shipping Rust binaries.
|
|
|
|
[libm]: https://github.com/rust-lang/libm
|
|
[micromath]: https://github.com/tarcieri/micromath
|