7 个版本
0.3.0 | 2024年3月10日 |
---|---|
0.2.0 | 2024年2月11日 |
0.1.4 | 2024年1月26日 |
#247 in Unix APIs
155KB
3.5K SLoC
container_image_dist_ref
一个 docker/OCI 镜像引用解析器。
此库针对权威镜像引用实现进行了广泛的测试,https://github.com/distribution/reference。
镜像引用遵循此 EBNF 语法
reference ::= name (":" tag )? ("@" digest )?
name ::= (domain "/")? path
domain ::= host (":" port-number)?
host ::= domain-name | IPv4address | "[" IPv6address "]" /* see https://www.rfc-editor.org/rfc/rfc3986#appendix-A */
domain-name ::= domain-component ("." domain-component)*
domain-component ::= ([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])
port-number ::= [0-9]+
path-component ::= [a-z0-9]+ (separator [a-z0-9]+)*
path ::= path-component ("/" path-component)*
separator ::= [_.] | "__" | "-"+
tag ::= [\w][\w.-]{0,127}
digest ::= algorithm ":" encoded
algorithm ::= algorithm-component (algorithm-separator algorithm-component)*
algorithm-separator ::= [+._-]
algorithm-component ::= [A-Za-z][A-Za-z0-9]*
encoded ::= [a-fA-F0-9]{32,} /* At least 128 bit digest value */
identifier ::= [a-f0-9]{64}
(这是从 https://github.com/distribution/reference/blob/main/reference.go 翻译的)
为了避免最坏情况下的性能,进一步限制了镜像引用
部分 | 最大长度 |
---|---|
名称 |
255 |
标签 |
127 |
摘要 |
1024 |
算法 |
255 |
动机
我想在一个 Rust 项目中使用 distribution/reference
,但不想处理 go
的 FFI。
目标
- 对
distribution/reference
解析器的忠实度 - 有趣的优化!
有关这些目标和设计选择,请参阅 ./ARCHITECTURE.md
。
基准测试
根据一些基本的基准测试,此库相对于 distribution/reference 至少提高了 10 倍的速度。
运行基准测试
#!/bin/bash
cargo bench # rust
( # go
cd internal/reference_oracle &&
go test -bench=.
)
我的机器上的基准测试
distribution/reference
goos: linux
goarch: amd64
pkg: github.com/skalt/container_image_dist_ref/internal/reference_oracle
cpu: Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
BenchmarkOracleEntireTestSuite-8 9218 148438 ns/op
此包
entire_test_suite time: [5.0737 µs 5.1349 µs 5.2047 µs]
speedup = (148438 ns) / ((5.1349 µs) * (1000 ns / µs)) = 28.908