jsZ85
jsZ85 provides an implementation of the Z85 codec following the zeromq rfc.
Examples
function 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));
Benchmarks
Following 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 |