til.jpace121/posts/powf_is_slow.md

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