Skip to content

Instantly share code, notes, and snippets.

@EvanHahn
Created June 17, 2024 19:38
Show Gist options
  • Save EvanHahn/9985a1452ff74e0ce2708b2a661cb895 to your computer and use it in GitHub Desktop.
Save EvanHahn/9985a1452ff74e0ce2708b2a661cb895 to your computer and use it in GitHub Desktop.
// @ts-check
import { generate } from '@mapeo/mock-data'
import { encode } from '@mapeo/schema'
import { gzipSync } from 'node:zlib'
/**
* @param {ReadonlyArray<any>} records
* @param {(record: any) => number} getSize
* @returns {number}
*/
const size = (records, getSize) =>
records.reduce((result, record) => result + getSize(record), 0)
/**
* @param {any} record
* @returns {number}
*/
const getEncodedSize = (record) => encode(record).byteLength
/**
* @param {any} record
* @returns {number}
*/
const getEncodedGzippedSize = (record) =>
gzipSync(encode(record), { level: 9 }).byteLength
const records = [
...generate('projectSettings', { count: 100 }),
...generate('observation', { count: 10_000 }),
...generate('field', { count: 1000 }),
...generate('preset', { count: 1000 }),
...generate('role', { count: 100 }),
...generate('deviceInfo', { count: 100 }),
// `translation` and `track` are missing from `@mapeo/mock-data`
// `icon` and `coreOwnership` had issues I did not investigate
]
console.log('Record count:', records.length)
const encodedSize = size(records, getEncodedSize)
console.log('Encoded size:', encodedSize, encodedSize / records.length, 'mean')
const encodedGzippedSize = size(records, getEncodedGzippedSize)
console.log(
'Encoded + gzipped size:',
encodedGzippedSize,
encodedGzippedSize / records.length,
'mean'
)
if (encodedSize < encodedGzippedSize) {
console.log(
`gzip made the result bigger by ${encodedGzippedSize - encodedSize} bytes`
)
} else {
console.log(
`gzip made the result smaller by ${encodedSize - encodedGzippedSize} bytes`
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment