Build

Parse3339

Parse3339 是一个用纯 Swift 编写的快速 RFC 3339 时间戳解析器。

RFC 3339 指定了 ISO 8601 中常用于时间戳的子集。此解析器进一步限制了该子集。Parse3339 支持以下格式:

无需任何配置,并且为了方便您复制粘贴而不是将其用作软件包,所有代码都位于单个文件中。

用法

import Parse3339

let s = "2023-07-09T13:14:00+03:00"
guard let parts = Parse3339.parse(s) else {
    return
}
let date = parts.date
print(date.timeIntervalSinceReferenceDate)
// output: 710590440.0

您可以使用一个辅助函数与 Foundation 的 JSONDecoder 结合使用

import Parse3339

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .custom(Parse3339.parseFromDecoder(_:))

有关 Package.swift 代码片段和文档,请访问 Swift Package Index 页面

速度和内存使用

Parse3339 速度快且内存占用小。该软件包包含基准测试

env PARSE3339_BENCHMARK=1 swift package benchmark --target ParserBenchmarks

它包含一些基准测试,这些测试使用 Foundation 的 DateFormatter、Foundation 的 ISO8601DateFormatter、Parse3339 通过 Foundation 的 DateComponentsCalendar 创建 Date 以及 Parse3339 通过标准 Unix 函数创建 Date 来解析相同的字符串。

一次运行的输出结果

Parse with DateFormatter
╒════════════════════════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╕
│ Metric                     │      p0 │     p25 │     p50 │     p75 │     p90 │     p99 │    p100 │ Samples │
╞════════════════════════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╡
│ Malloc (total)             │     275 │     275 │     275 │     275 │     275 │     275 │     279 │  100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Memory (resident peak) (M) │      11 │      15 │      19 │      23 │      25 │      27 │      27 │  100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Throughput (# / s) (K)     │      17 │      16 │      16 │      16 │      15 │      12 │       1 │  100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (total CPU) (ns)      │   59084 │   59967 │   60255 │   61887 │   64927 │   82175 │  236750 │  100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (wall clock) (ns)     │   58500 │   59391 │   59647 │   61279 │   64255 │   83327 │  513167 │  100000 │
╘════════════════════════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╛

Parse with ISO8601DateFormatter
╒════════════════════════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╕
│ Metric                     │      p0 │     p25 │     p50 │     p75 │     p90 │     p99 │    p100 │ Samples │
╞════════════════════════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╡
│ Malloc (total)             │     496 │     496 │     496 │     496 │     496 │     496 │     497 │  100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Memory (resident peak) (K) │    9764 │    9781 │    9781 │    9781 │    9781 │    9781 │    9781 │  100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Throughput (# / s) (K)     │      11 │      10 │      10 │      10 │      10 │       7 │       0 │  100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (total CPU) (ns)      │   91375 │   92351 │   92799 │   95551 │   99519 │  123007 │  542458 │  100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (wall clock) (ns)     │   90792 │   91711 │   92159 │   94911 │   98879 │  127487 │ 3553542 │  100000 │
╘════════════════════════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╛

Parse with Parse3339 (DateComponents)
╒════════════════════════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╕
│ Metric                     │      p0 │     p25 │     p50 │     p75 │     p90 │     p99 │    p100 │ Samples │
╞════════════════════════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╡
│ Malloc (total)             │      64 │      64 │      64 │      64 │      64 │      64 │      67 │  100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Memory (resident peak) (M) │       9 │      41 │      73 │     105 │     124 │     136 │     137 │  100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Throughput (# / s) (K)     │      43 │      42 │      42 │      41 │      38 │      29 │       4 │  100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (total CPU) (ns)      │   23416 │   23999 │   24223 │   25007 │   26463 │   34751 │  206791 │  100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (wall clock) (ns)     │   22833 │   23423 │   23631 │   24383 │   25807 │   34335 │  211458 │  100000 │
╘════════════════════════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╛

Parse with Parse3339 (Unix time)
╒════════════════════════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╕
│ Metric                     │      p0 │     p25 │     p50 │     p75 │     p90 │     p99 │    p100 │ Samples │
╞════════════════════════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╡
│ Malloc (total)             │       0 │       0 │       0 │       0 │       0 │       0 │       0 │  100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Memory (resident peak) (K) │    7831 │    7852 │    7864 │    7864 │    7864 │    7864 │    7864 │  100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Throughput (# / s) (K)     │     263 │     252 │     247 │     242 │     233 │     183 │      17 │  100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (total CPU) (ns)      │    4333 │    4503 │    4543 │    4667 │    4875 │    6543 │   48584 │  100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (wall clock) (ns)     │    3791 │    3959 │    4041 │    4127 │    4291 │    5459 │   56625 │  100000 │
╘════════════════════════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╛