This package provides a base64 encoder and decoder in Swift without the use of Foundation. The implementation is RFC4648 complient and is faster than the Foundation base64 implementation.
To achieve performance the implementation uses Chromium precomputed lookup tables and makes heavy use of unsafe swift API. When Swift has better support for SIMD instructions this might be an area worth exploring.
Tests were run on a MacBook Pro (16-inch, late 2019). Processor: 2.4 GHz 8-Core Intel Core i9.
macOS - swift 5.3
Encoding
Decoding
Foundation
2.08s
2.15s
swift-extras-base64
0.66s
0.54s
Speedup
3x
4x
Linux - swift 5.3
Encoding
Decoding
Foundation
1.01s
5.5s
swift-extras-base64
0.27s
0.41s
Speedup
3x
~10x
Literature for a faster algorithm
I would really like to speed up this project further to be way faster than it is today. Some food for thought of how this could be tackled can be found here:
swift-extras-base64
This package provides a base64 encoder and decoder in Swift without the use of Foundation. The implementation is RFC4648 complient and is faster than the Foundation base64 implementation.
To achieve performance the implementation uses Chromium precomputed lookup tables and makes heavy use of unsafe swift API. When Swift has better support for SIMD instructions this might be an area worth exploring.
Status
A former implementation of this package is used in
swift-nio
‘s websocket implementation.Performance
Super simple performance test to ensure speediness of this implementation. Encoding and decoding 1m times the base64 string:
Tests were run on a MacBook Pro (16-inch, late 2019). Processor: 2.4 GHz 8-Core Intel Core i9.
macOS - swift 5.3
Linux - swift 5.3
Literature for a faster algorithm
I would really like to speed up this project further to be way faster than it is today. Some food for thought of how this could be tackled can be found here:
Alternatives
As of today (2019-12-10), the author is aware of only one alternative that offers merely encoding.