3 个不稳定版本
0.2.0 | 2023年7月14日 |
---|---|
0.1.9 | 2022年12月23日 |
0.1.8 | 2022年6月17日 |
0.1.7 |
|
#9 in #密集
每月 下载次数 75
用于 reactive-mutiny
30KB
322 行
neat-date-time 包
日期和时间的密集且可序列化的表示,提供原生类型和操作以实现空间高效存储。
浏览 文档。
问题陈述
Rust 的 std
(以及 chrono
库)提供了通用的日期和时间结构,这意味着它们提供了
- 通用范围
- 通用精度
为了这种通用性,需要付出存储成本。因此,对于特定领域需求,可以通过调整这两个属性来优化空间。
应用示例
以股票市场为例。交易可以按每日集进行分组,而单个交易将在交易时段的开市和收市之间发生。可能的优化包括
- 日期范围:通过使用单个
u16
,我们能够表示约179年的时间——通过使用纪元日期,任何std
或chrono
日期都可以转换为u16
并反向转换; - 时间范围与精度:这里有两个选项:使用完整的24小时范围(尽可能高的精度)或使用部分范围——比如说,12小时——精度是其两倍。如果我们用
u32
表示时间,24小时范围将允许大约20.117µs的精度(或者更精确地,1/((2^32)/86400)*1e6
µs)。另一方面,如果我们想要精确到10µs的精度,一个u32可以表示11:55:49.67296秒(从公式s*1e6 / (2^32) = µs_precision
得出,这相当于s=(2^32)/1e5
)
优化分析
std::time::Duration
使用96位——u32
只是它的1/3;chrono
的NaiveDate
使用i32
——u16
将其减半。
包含日期、时间、8个字符的资产、u32单价和u32数量的交易记录将需要原始大小的68.75%——即16/11的关系。
如果按资产和日期分组交易,优化后的版本将只需要原始大小的60%。
此外,通过允许将日期和时间表示为原生整数类型,可以辅助序列化。
使用示例
时间
#![allow(uncommon_codepoints)]
use neat_date_time::neat_time;
let (h, m, s, ms, µs) = (17, 32, 42, 937, 3);
let expected_duration = std::time::Duration::from_micros(µs+(ms+(s+(m+h*60)*60)*1000)*1000);
let u32_duration = neat_time::u32_from_24h_duration(&expected_duration);
dbg!(u32_duration);
let observed_duration = neat_time::duration_from_24h_u32(u32_duration);
assert_eq!(observed_duration, expected_duration, "std duration <--> u32 conversions failed");
u32
日期
use neat_date_time::neat_date;
let (original_year, original_month, original_day) = (1979, 01, 22);
let epoch = neat_date::u32_from_ymd(original_year as u16, original_month as u8, original_day as u8);
dbg!(epoch);
let (reconstructed_year, reconstructed_month, reconstructed_day) = neat_date::ymd_from_u32(epoch);
assert_eq!((reconstructed_year, reconstructed_month, reconstructed_day), (original_year, original_month, original_day), "naive dates <--> u32 conversions failed");
注意
这是第一个版本,只是从现有代码中重构出来的。下一个版本将有一个更好的API以供通用。
目前,u16
日期可以表示为从u32
日期的偏移量:只需将u16
日期加到或从u32
绝对日期中即可。