这个包提供了 Swift 中的 base64 编码器和解码器,无需使用 Foundation 框架。 该实现符合 RFC4648 标准,并且比 Foundation 的 base64 实现更快。
为了获得高性能,该实现使用了 Chromium 预计算查找表,并大量使用了不安全的 Swift API。 当 Swift 对 SIMD 指令有更好的支持时,这可能是一个值得探索的领域。
这个包以前的实现 被用在 swift-nio
的 websocket 实现中。
超级简单的性能测试,以确保此实现的速度。 编码和解码 base64 字符串 100 万次
AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==
测试在 MacBook Pro (16-inch, late 2019) 上运行。 处理器:2.4 GHz 8 核 Intel Core i9。
编码 | 解码 | |
---|---|---|
Foundation | 2.08 秒 | 2.15 秒 |
swift-extras-base64 | 0.66 秒 | 0.54 秒 |
加速 | 3 倍 | 4 倍 |
编码 | 解码 | |
---|---|---|
Foundation | 1.01 秒 | 5.5 秒 |
swift-extras-base64 | 0.27 秒 | 0.41 秒 |
加速 | 3 倍 | ~10 倍 |
我真的很想进一步加速这个项目,使其比现在更快。 这里有一些关于如何解决这个问题的想法
截至今天 (2019-12-10),作者只知道一个仅提供编码的替代方案。