In particular if built with `--all-features` or `features = "all"` we don't
want to accidentally make it look like `YearFlags` are something that people
should use. So: hide it from docs and put it behind a dunder.
It has a ton of great features[1], including stronger statistical signifance
tests, making comparisons to previous or baseline runs, nice plots, and being
able to be run on stable.
1: https://bheisler.github.io/criterion.rs/book/
Something that wasn't part of this PR: the work to support nested
`Option<[ChronoType]>` was merged without being adjusted for the no-std
support
And now there are some unused import warnings because they need to get
configged out.
The original would first check that there is right amount of numeric
characters and then parsed them using the std::str::parse, which
internally checks the characters again and also checks for -/+ prefix,
which is not necessary in this case.
Since we are already going over the characters, we may as well do the
parsing ourselves. The length of the function is roughly the same and
it is faster:
name simplify-from-str ns/iter reimplement-number ns/iter diff ns/iter diff % speedup
datetime::tests::bench_datetime_from_str 448 365 -83 -18.53% x 1.23
datetime::tests::bench_datetime_parse_from_rfc2822 242 195 -47 -19.42% x 1.24
datetime::tests::bench_datetime_parse_from_rfc3339 234 166 -68 -29.06% x 1.41
The Item::Space calls str::trim_left and Item::Numeric also calls
str::trim_left before doing anything else, so there is no need to
have Item::Space before Item::Numeric.
Speeds up parsing:
name remove-cloned ns/iter simplify-from-str ns/iter diff ns/iter diff % speedup
datetime::tests::bench_datetime_from_str 582 448 -134 -23.02% x 1.30
datetime::tests::bench_datetime_parse_from_rfc2822 244 242 -2 -0.82% x 1.01
datetime::tests::bench_datetime_parse_from_rfc3339 239 234 -5 -2.09% x 1.02
The parse::parse and format::format functions accepted Iterator of owned
Items. While it is sometimes convenient to pass in the owned values,
neither of the functions really need to own them, so references would
be enough. The Borrow trait allows us to pass in Iterator over values,
references, boxes, etc.
According to RFC 1105 this is a minor change, because it shouldn't break
any existing code. And chrono is in pre-1.0 version anyway.
This allows us to remove multiple cloned() calls which speeds up parsing
and formating:
name control ns/iter remove-cloned ns/iter diff ns/iter diff % speedup
datetime::tests::bench_datetime_from_str 712 582 -130 -18.26% x 1.22
datetime::tests::bench_datetime_parse_from_rfc2822 252 244 -8 -3.17% x 1.03
datetime::tests::bench_datetime_parse_from_rfc3339 242 239 -3 -1.24% x 1.01
The #[cfg(bench)] attribute does not exist and is always false. Lets
define a feature "bench" which can be used to enable benchmarks when
building with nightly.
Deciding between zero-indexed (slightly more reasonable, more compatible with
the outside world) and one-indexed (same indexing as `num_days_from_ce`) seems
not worth it. It's trivial to build `num_days_from_epoch` based on the docs in
`num_days_from_ce`, which punts on the decision and is therefor probably the
right decision.
The new wording tries to make clearer that those methods use a 1-based
numbering scheme.
This commit also includes a couple of drive-by cosmetic changes.