パッケージの詳細

jsz85

jsZ85 provides an implementation of the Z85 codec following the specs of https://rfc.zeromq.org/spec/32/. It is a port of the https://github.com/ruben-viscomi/ktZ85 implementation for Kotlin.

codec, base85, Z85, encoding

readme

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!";

// ENCODING EXAMPLE
const encoded = Z85.encode(getBytes(toEncode));
console.log(encoded); // Outputs: nm=QNz.92jz/PV8aP

// DECODING EXAMPLE
const decoded = Z85.decode(encoded);
console.log(String.fromCharCode(...decoded)); // Outputs: Hello, World!

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