19 releases
0.4.9 | Sep 10, 2024 |
---|---|
0.4.8 | Apr 12, 2024 |
0.4.7 | Mar 16, 2024 |
0.4.5 | Dec 29, 2023 |
0.1.3 | Nov 28, 2022 |
#13 in Geospatial
13,150 downloads per month
Used in 4 crates
155KB
387 lines
tzf-rs: a fast timezone finder for Rust.
[!NOTE]
This package uses simplified shape data so it is not entirely accurate around the border.
- Released documentation: docs.rs/tzf-rs
- Latest documentation(not released yet): ringsaturn.github.io/tzf-rs
Build options
By default, the binary is built as well. If you don't want/need it, you can omit the default features and build like this:
cargo build --no-default-features
Or add in the below way:
cargo add tzf-rs --no-default-features
Best Practices
It's expensive to init tzf-rs's Finder
/FuzzyFinder
/DefaultFinder
, so
please consider reusing instances or creating one as a global variable. Below is
a global variable example:
use lazy_static::lazy_static;
use tzf_rs::DefaultFinder;
lazy_static! {
static ref FINDER: DefaultFinder = DefaultFinder::new();
}
fn main() {
print!("{:?}\n", FINDER.get_tz_name(116.3883, 39.9289));
print!("{:?}\n", FINDER.get_tz_names(116.3883, 39.9289));
}
For reuse,
racemap/rust-tz-service
provides
a good example.
A Redis protocol demo could be used here:
ringsaturn/redizone
.
Performance
The tzf-rs package is intended for high-performance geospatial query services,
such as weather forecasting APIs. Most queries can be returned within a very
short time, averaging around 3,000 nanoseconds (about 1,000ns slower than with
Go repo tzf
. I will continue improving this - you can track progress
here).
Here is what has been done to improve performance:
- Using pre-indexing to handle most queries takes approximately 1000 nanoseconds.
- Using a finely-tuned Ray Casting algorithm package
ringsaturn/geometry-rs
to verify whether a polygon contains a point.
That's all. There are no black magic tricks inside the tzf-rs.
Below is a benchmark run on global cities(about 14K), and avg time is about 3,000 ns per query:
test benches_default::bench_default_finder_random_city ... bench: 2,870 ns/iter (+/- 182)
Criterion result | Pic |
---|---|
Regression |
You can view more details from latest benchmark from GitHub Actions logs.
References
I have written an article about the history of tzf
, its Rust port, and its
Rust port's Python binding; you can view it
here.
- Original Go repo:
ringsaturn/tzf
- Binary timezone data:
ringsaturn/tzf-rel
- Geometry: use
ringsaturn/geometry-rs
which istidwall/geometry
's Rust port. - Continuous Benchmark compared with other packages:
ringsaturn/tz-benchmark
Bindings
- Ruby, see
HarlemSquirrel/tzf-rb
- Python, see
ringsaturn/tzfpy
LICENSE
This project is licensed under the MIT license. The data is
licensed under the
ODbL license, same as
evansiroky/timezone-boundary-builder
Dependencies
~14MB
~68K SLoC