2个版本
0.1.2 | 2022年10月30日 |
---|---|
0.1.0 | 2022年10月25日 |
#1064 in 算法
66KB
496 行
Hilbert曲线算法
Hilbert曲线算法的Rust实现。该库可以从点(x, y)移动到索引(z),以及从索引(z)移动到点(x, y)。
作为库的消费者
安装
cargo add hilbert-curve-rust
关于Crate.io的详细信息
如何使用?
Hilbert Curve Rust库的Rust文档可在网上找到。然而,以下有两个示例以供开始。
索引到点
单维整数到二维坐标
let hilbert_curve = HilbertCurveAlgorithm::new(1); // Set the Hilbert order here
let point = hilbert_curve.index_to_point(0); // Get the point for index 0
点到索引
二维坐标到单维整数。
let hilbert_curve = HilbertCurveAlgorithm::new(1);// Set the Hilbert order here
let index = hilbert_curve.point_to_index(CoordinateValue { x: 0, y: 0 }); // Get the index for (0,0) point
作为Hibert Curve Rust库的开发者
如果您想为Hibert Curve Rust代码库做出贡献,以下是一些可能有用的信息。
测试和覆盖率
覆盖率
在运行覆盖率之前,您必须安装一些组件
cargo install grcov
rustup component add llvm-tools-preview
然后,您可以运行
./coverage.sh
更多解释请参见Mozilla grcov网站
文档
cargo doc --open
基准测试
./benchmark.sh
发布
cargo login
cargo publish --dry-run
cargo publish
与其他Rust库的性能比较
在8阶上的比较
基准测试找出每个位置(x,y)的所有索引,并计算出扫描所有位置的平均时间。
库 | 平均值 |
---|---|
fast_hilbert | 0.3364 ms |
hilbert_curve | 0.7496 ms |
hilbert-curve-rust | 1.0290 ms |
hilbert_2d | 1.3298 ms |
hilbert | 9.9606 ms |
在不同阶数上比较每个框架
测试循环遍历所有x, y坐标以查找索引。以下是每个框架的平均值。
图中显示了三个明显的组。最差的算法是hilbert,它在10阶之后呈指数级变差。
第二组包含这个库(hilbert-curve-rust),性能更稳定,但大约在12阶时开始变差。
最后一组有一个算法,即fast_hilbert,是明显最快的算法。
从某些角度来看,1024x1024(约100万个点/像素)的网格对于任何库来说都很不错。然而,如果您需要从8192x8192(13阶,67百万个点/像素)的网格开始,那么使用fast_hilbert可能更好。图表显示了第二组紧挨着最佳组,但现实是fast_hilbert可以比其他三个竞争者快10倍。
性能学习经验
通过在函数update_rx_from_point
、update_ry_from_point
、update_point_value_from_number
、move_point
和rotate_point
中使用引用而不是复制值,将基准测试减少了约3秒。
图表显示了使用引用而不是不可变值时的变化,以前基准测试用红色表示,而蓝色表示使用引用。通过移除对象的副本并传递引用,程序需要创建更少的内存,并且只需更改特定内存中的值。这种收益是显著的。