d3geovoronoi_rs

rust 2021 edition.

crates.io Documentation Download

About

This is a port of the d3-geo-voronoi library into a RUST library.

As a example the library can be used to compute the following delaunay mesh. Delaunay mesh from a set of random points on a sphere

( computed from 6,000 points on a sphere selected at random )

Currently we have 84% test coverage ( as reported by cargo tarpaulin -o Html )

A collection of d3 sub packages is being ported to rust.

Performance Profiling

Demo Page

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.

Profile Target

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

Further Development

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"

Instructions for building the benchmark

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