jsZ85jsZ85 provides an implementation of the Z85 codec following the zeromq rfc .
Examplesfunction getBytes ( str: string ) : Uint8Array {
return new TextEncoder ( ) . encode ( str) ;
}
const toEncode = "Hello, World!" ;
const encoded = Z85 . encode ( getBytes ( toEncode) ) ;
console . log ( encoded) ;
const decoded = Z85 . decode ( encoded) ;
console . log ( String. fromCharCode ( ... decoded) ) ; BenchmarksFollowing the results on my machine of the benchmarks found in the bench folder.
Node.js (Buffer base64 vs. Z85)┌─────────┬──────────┬───────────────────┬───────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┐
│ ( index) │ codec │ numberOfBenchRuns │ inputSize │ averageTimeElapsedToEncode │ averageTimeElapsedToDecode │ timeElapsedToEncodeAllRuns │ timeElapsedToDecodeAllRuns │
├─────────┼──────────┼───────────────────┼───────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┤
│ 0 │ 'base64' │ 5 │ '39b' │ '43.480µs' │ '13.560µs' │ '217.400µs' │ '67.800µs' │
│ 1 │ 'Z85' │ 5 │ '39b' │ '35.640µs' │ '44.540µs' │ '178.200µs' │ '222.700µs' │
└─────────┴──────────┴───────────────────┴───────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┘
┌─────────┬──────────┬───────────────────┬───────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┐
│ ( index) │ codec │ numberOfBenchRuns │ inputSize │ averageTimeElapsedToEncode │ averageTimeElapsedToDecode │ timeElapsedToEncodeAllRuns │ timeElapsedToDecodeAllRuns │
├─────────┼──────────┼───────────────────┼───────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┤
│ 0 │ 'base64' │ 5 │ '1.00KB' │ '3.960µs' │ '5.700µs' │ '19.800µs' │ '28.500µs' │
│ 1 │ 'Z85' │ 5 │ '1.00KB' │ '64.580µs' │ '59.800µs' │ '322.900µs' │ '299.000µs' │
└─────────┴──────────┴───────────────────┴───────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┘
┌─────────┬──────────┬───────────────────┬───────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┐
│ ( index) │ codec │ numberOfBenchRuns │ inputSize │ averageTimeElapsedToEncode │ averageTimeElapsedToDecode │ timeElapsedToEncodeAllRuns │ timeElapsedToDecodeAllRuns │
├─────────┼──────────┼───────────────────┼───────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┤
│ 0 │ 'base64' │ 5 │ '10.00KB' │ '32.600µs' │ '36.560µs' │ '163.000µs' │ '182.800µs' │
│ 1 │ 'Z85' │ 5 │ '10.00KB' │ '1.377ms' │ '1.210ms' │ '6.886ms' │ '6.049ms' │
└─────────┴──────────┴───────────────────┴───────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┘
┌─────────┬──────────┬───────────────────┬────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┐
│ ( index) │ codec │ numberOfBenchRuns │ inputSize │ averageTimeElapsedToEncode │ averageTimeElapsedToDecode │ timeElapsedToEncodeAllRuns │ timeElapsedToDecodeAllRuns │
├─────────┼──────────┼───────────────────┼────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┤
│ 0 │ 'base64' │ 5 │ '100.00KB' │ '182.080µs' │ '243.120µs' │ '910.400µs' │ '1.216ms' │
│ 1 │ 'Z85' │ 5 │ '100.00KB' │ '4.706ms' │ '668.220µs' │ '23.528ms' │ '3.341ms' │
└─────────┴──────────┴───────────────────┴────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┘
┌─────────┬──────────┬───────────────────┬────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┐
│ ( index) │ codec │ numberOfBenchRuns │ inputSize │ averageTimeElapsedToEncode │ averageTimeElapsedToDecode │ timeElapsedToEncodeAllRuns │ timeElapsedToDecodeAllRuns │
├─────────┼──────────┼───────────────────┼────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┤
│ 0 │ 'base64' │ 5 │ '500.00KB' │ '517.120µs' │ '1.340ms' │ '2.586ms' │ '6.702ms' │
│ 1 │ 'Z85' │ 5 │ '500.00KB' │ '15.727ms' │ '3.849ms' │ '78.637ms' │ '19.247ms' │
└─────────┴──────────┴───────────────────┴────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┘
┌─────────┬──────────┬───────────────────┬───────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┐
│ ( index) │ codec │ numberOfBenchRuns │ inputSize │ averageTimeElapsedToEncode │ averageTimeElapsedToDecode │ timeElapsedToEncodeAllRuns │ timeElapsedToDecodeAllRuns │
├─────────┼──────────┼───────────────────┼───────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┤
│ 0 │ 'base64' │ 5 │ '1.00MB' │ '295.800µs' │ '1.587ms' │ '1.479ms' │ '7.937ms' │
│ 1 │ 'Z85' │ 5 │ '1.00MB' │ '36.169ms' │ '6.690ms' │ '180.846ms' │ '33.448ms' │
└─────────┴──────────┴───────────────────┴───────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┘
┌─────────┬──────────┬───────────────────┬───────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┐
│ ( index) │ codec │ numberOfBenchRuns │ inputSize │ averageTimeElapsedToEncode │ averageTimeElapsedToDecode │ timeElapsedToEncodeAllRuns │ timeElapsedToDecodeAllRuns │
├─────────┼──────────┼───────────────────┼───────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┤
│ 0 │ 'base64' │ 5 │ '10.00MB' │ '3.596ms' │ '18.039ms' │ '17.978ms' │ '90.196ms' │
│ 1 │ 'Z85' │ 5 │ '10.00MB' │ '619.946ms' │ '81.798ms' │ '3.100s' │ '408.990ms' │
└─────────┴──────────┴───────────────────┴───────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┘
┌─────────┬──────────┬───────────────────┬────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┐
│ ( index) │ codec │ numberOfBenchRuns │ inputSize │ averageTimeElapsedToEncode │ averageTimeElapsedToDecode │ timeElapsedToEncodeAllRuns │ timeElapsedToDecodeAllRuns │
├─────────┼──────────┼───────────────────┼────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┤
│ 0 │ 'base64' │ 5 │ '100.00MB' │ '81.588ms' │ '218.865ms' │ '407.941ms' │ '1.094s' │
│ 1 │ 'Z85' │ 5 │ '100.00MB' │ '7.420s' │ '836.813ms' │ '37.098s' │ '4.184s' │
└─────────┴──────────┴───────────────────┴────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┘ Chrome - V8 engine (btoa/atob base64 vs. Z85)
codec
numberOfBenchRuns
inputSize
averageTimeElapsedToEncode
averageTimeElapsedToDecode
timeElapsedToEncodeAllRuns
timeElapsedToDecodeAllRuns
base64
5
39b
20.000µs
20.000µs
100.000µs
100.000µs
Z85
5
39b
80.000µs
40.000µs
400.000µs
200.000µs
codec
numberOfBenchRuns
inputSize
averageTimeElapsedToEncode
averageTimeElapsedToDecode
timeElapsedToEncodeAllRuns
timeElapsedToDecodeAllRuns
base64
5
1.00KB
60.000µs
0.00000ms
300.000µs
0.00000ms
Z85
5
1.00KB
120.000µs
100.000µs
600.000µs
500.000µs
codec
numberOfBenchRuns
inputSize
averageTimeElapsedToEncode
averageTimeElapsedToDecode
timeElapsedToEncodeAllRuns
timeElapsedToDecodeAllRuns
base64
5
10.00KB
200.000µs
40.000µs
1.000ms
200.000µs
Z85
5
10.00KB
800.000µs
260.000µs
4.000ms
1.300ms
codec
numberOfBenchRuns
inputSize
averageTimeElapsedToEncode
averageTimeElapsedToDecode
timeElapsedToEncodeAllRuns
timeElapsedToDecodeAllRuns
base64
5
100.00KB
2.060ms
540.000µs
10.300ms
2.700ms
Z85
5
100.00KB
6.140ms
1.680ms
30.700ms
8.400ms
codec
numberOfBenchRuns
inputSize
averageTimeElapsedToEncode
averageTimeElapsedToDecode
timeElapsedToEncodeAllRuns
timeElapsedToDecodeAllRuns
base64
5
500.00KB
7.480ms
2.000ms
37.400ms
10.000ms
Z85
5
500.00KB
12.960ms
3.980ms
64.800ms
19.900ms
codec
numberOfBenchRuns
inputSize
averageTimeElapsedToEncode
averageTimeElapsedToDecode
timeElapsedToEncodeAllRuns
timeElapsedToDecodeAllRuns
base64
5
1.00MB
13.580ms
3.820ms
67.900ms
19.100ms
Z85
5
1.00MB
30.020ms
7.440ms
150.100ms
37.200ms
codec
numberOfBenchRuns
inputSize
averageTimeElapsedToEncode
averageTimeElapsedToDecode
timeElapsedToEncodeAllRuns
timeElapsedToDecodeAllRuns
base64
5
10.00MB
306.140ms
94.060ms
1.531s
470.300ms
Z85
5
10.00MB
911.360ms
181.060ms
4.557s
905.300ms
codec
numberOfBenchRuns
inputSize
averageTimeElapsedToEncode
averageTimeElapsedToDecode
timeElapsedToEncodeAllRuns
timeElapsedToDecodeAllRuns
base64
5
100.00MB
3.495s
1.057s
17.477s
5.284s
Z85
5
100.00MB
9.482s
1.796s
47.413s
8.979s
Firefox - SpiderMonkey engine (btoa/atob base64 vs. Z85)
codec
numberOfBenchRuns
inputSize
averageTimeElapsedToEncode
averageTimeElapsedToDecode
timeElapsedToEncodeAllRuns
timeElapsedToDecodeAllRuns
base64
5
39b
0.00000ms
0.00000ms
0.00000ms
0.00000ms
Z85
5
39b
0.00000ms
0.00000ms
0.00000ms
0.00000ms
codec
numberOfBenchRuns
inputSize
averageTimeElapsedToEncode
averageTimeElapsedToDecode
timeElapsedToEncodeAllRuns
timeElapsedToDecodeAllRuns
base64
5
1.00KB
0.00000ms
200.000µs
0.00000ms
1.000ms
Z85
5
1.00KB
0.00000ms
200.000µs
0.00000ms
1.000ms
codec
numberOfBenchRuns
inputSize
averageTimeElapsedToEncode
averageTimeElapsedToDecode
timeElapsedToEncodeAllRuns
timeElapsedToDecodeAllRuns
base64
5
10.00KB
1.000ms
0.00000ms
5.000ms
0.00000ms
Z85
5
10.00KB
400.000µs
0.00000ms
2.000ms
0.00000ms
codec
numberOfBenchRuns
inputSize
averageTimeElapsedToEncode
averageTimeElapsedToDecode
timeElapsedToEncodeAllRuns
timeElapsedToDecodeAllRuns
base64
5
100.00KB
7.400ms
1.400ms
37.000ms
7.000ms
Z85
5
100.00KB
3.200ms
2.600ms
16.000ms
13.000ms
codec
numberOfBenchRuns
inputSize
averageTimeElapsedToEncode
averageTimeElapsedToDecode
timeElapsedToEncodeAllRuns
timeElapsedToDecodeAllRuns
base64
5
500.00KB
34.200ms
3.200ms
171.000ms
16.000ms
Z85
5
500.00KB
11.200ms
8.000ms
56.000ms
40.000ms
codec
numberOfBenchRuns
inputSize
averageTimeElapsedToEncode
averageTimeElapsedToDecode
timeElapsedToEncodeAllRuns
timeElapsedToDecodeAllRuns
base64
5
1.00MB
52.400ms
5.600ms
262.000ms
28.000ms
Z85
5
1.00MB
16.000ms
15.000ms
80.000ms
75.000ms
codec
numberOfBenchRuns
inputSize
averageTimeElapsedToEncode
averageTimeElapsedToDecode
timeElapsedToEncodeAllRuns
timeElapsedToDecodeAllRuns
base64
5
10.00MB
850.400ms
74.600ms
4.252s
373.000ms
Z85
5
10.00MB
258.800ms
132.600ms
1.294s
663.000ms
codec
numberOfBenchRuns
inputSize
averageTimeElapsedToEncode
averageTimeElapsedToDecode
timeElapsedToEncodeAllRuns
timeElapsedToDecodeAllRuns
base64
5
100.00MB
8.463s
759.800ms
42.316s
3.799s
Z85
5
100.00MB
2.762s
1.194s
13.809s
5.971s