rust 2021 edition.
Given a set of objects in spherical coordinates, it computes their Delaunay triangulation and its dual, the Voronoi diagram.
This is a port of the d3-geo-voronoi library into a RUST library.
It is part of a collection of d3 modules ported to rust.
d3geovoronoi_rs
As a example the library can be used to compute the following delaunay mesh.
( computed from 6,000 points on a sphere selected at random )
Currently we have 84% test coverage ( as reported by cargo tarpaulin -o Html )
The original javascript library has a benchmark in the form of web page which records the number of frames displayed per second. For comparison the benchmark has been ported.
Measuring the performance of a library is complicated, as different applications employing the library may see different results. Desktop and mobile performance may differ.
There are traditionally two way of measuring increases in performance :-
A) Speed: By asking how long it takes to perform a certain computation?
B) Throughput: By asking how much more work can I perform in a given time?
A and B are ideally linearly related, but often high throughput requires more memory which may increase page swapping. Javascript uses garbage collection, rust does not. In garbage collected environments, the dynamics of a collectors behaviors may cause the figures reported by A and B to diverge.
Here are the results for the benchmark :-
A) When I tune the benchmark for 60ps, I find the javascript can render 600 points in 16ms. The rust version performs the same workload in 11ms. ( a 31% speedup ).
B) When I increase the number of points given to the RUST version to render, I find I can render 826 in 16ms. An increase in throughput of 37%.
I am currently looking to add more benchmarks, a diverse collection of example application code, will give greater confidence in what to expect.
This workspace contain a binary "profiletarget" which outputs the result of a computation similar to that of the demopage. Before API finalization - I am currently using cargo flame-graph to identify any obvious optimizations.
from rustd3geo_voronoi
console
cargo install flamegraph
cargo flamegraph -- profile_target
Known bugs
Currently the demo works only then f64 is used as the floating point type. [For f32 the cell integrity is broken as some of the cell appear to take-up the whole sphere.] To be ported:-
contour.js and geo-contour-test.js
Currently there is a failing test suite geovoronoitest.rs "geoVoronoi.hull does not break on difficult polygons"
I'm using wasm pack to package the following packages into a single wasm file. rustd3geo, rustd3delaunay.
The application displays a delaunay mesh of a large number of cells onto a sphere.
To build and start the web server:-
console
cd benchmark\www
npm install
npm run start
The last command automatically starts your web browser.
For benchmarking, to obtain best performance
console
cd benchmark\www
npm run build
npm run serve