Bubble Sort Benchmark in Rust
July 01, 2020 - Søren Alsbjerg HørupOne of my colleagues have updated my Bubble Sort Benchmark with a Rust implementation, and the results are in!
> ./start.bat
> clang -O -fsanitize=address main.cpp && a.exe
Creating library a.lib and object a.exp
30125ms to sort 50000 elements 10 times (Vector)
22985ms to sort 50000 elements 10 times (Array)
> clang -O main.cpp && a.exe
10281ms to sort 50000 elements 10 times (Vector)
9906ms to sort 50000 elements 10 times (Array)
> dotnet run --configuration=Release
32547ms to sort 50000 elements 10 times (List)
15531ms to sort 50000 elements 10 times (Array)
> node index.js
28133ms to sort 50000 elements 10 times
> rustc -O main.rs -o rust.exe
> rust.exe
Took: 10.5915778s to sort 50000 elements 10 times
As seen, sorting 50k elements 10 times took 10.59 seconds using Rust. The C++ implementation was a tad faster at 9.9 seconds when using C arrays and 10.28 seconds when using std::vector. However, the C++ implementation does not guarantee against memory corruption, which is the case with Rust. The paid memory safety overhead of 3-7% in Rust, is in my opinion worth it.
Comparing the address sanitized version of the C++ array implementation, Rust is twice as fast fast: 10.59 vs 22.98 seconds. I believe this is due to the implementation of the sanitizer in clang, i.e. it needs protect every memory access, since C++ allows pointer arithmetic. Rust does not allow such programming behavior, unless wrapped in unsafe {}
.
Compared with the node and DotNet core implementations of Bubble sort, the Rust implementation is between 50% (DotNet Array) and 300% (DotNet List) faster, which again is not surprising due to the restrictions of the Rust language: which allows for tight optimizations without introducing runtime checks (except for array out of bounds).
Rust is an awesome language and I definitely hope to see it succeed!