122 lines
3.2 KiB
TypeScript
122 lines
3.2 KiB
TypeScript
import { bench, describe } from 'vitest';
|
|
import { Reader, Writer, deserialize, serialize } from '../../plugin/index.ts';
|
|
import {
|
|
buildBook,
|
|
buildOrder,
|
|
buildTicker,
|
|
registerAll,
|
|
} from './payloads.ts';
|
|
|
|
const codecs = registerAll();
|
|
|
|
const ticker = buildTicker();
|
|
const order = buildOrder();
|
|
const book = buildBook(1000);
|
|
|
|
// Pre-allocated pooled Writers (sized generously so we don't measure grow()).
|
|
const wTicker = new Writer(256);
|
|
const wOrder = new Writer(256);
|
|
const wBook = new Writer(64 * 1024);
|
|
|
|
// Pre-encoded buffers for decode benches.
|
|
const tickerJSON = JSON.stringify(ticker);
|
|
const orderJSON = JSON.stringify(order);
|
|
const bookJSON = JSON.stringify(book);
|
|
|
|
const tickerBin = serialize(ticker, codecs.ticker);
|
|
const orderBin = serialize(order, codecs.order);
|
|
const bookBin = serialize(book, codecs.book);
|
|
|
|
// One-time payload-size print on module load so it appears once in bench output.
|
|
// eslint-disable-next-line no-console
|
|
console.log(
|
|
'\n--- payload sizes ---\n' +
|
|
`ticker | json: ${tickerJSON.length}b bin: ${tickerBin.length}b (${((tickerBin.length / tickerJSON.length) * 100).toFixed(0)}%)\n` +
|
|
`order | json: ${orderJSON.length}b bin: ${orderBin.length}b (${((orderBin.length / orderJSON.length) * 100).toFixed(0)}%)\n` +
|
|
`book | json: ${bookJSON.length}b bin: ${bookBin.length}b (${((bookBin.length / bookJSON.length) * 100).toFixed(0)}%)\n`,
|
|
);
|
|
|
|
describe('encode ticker (5 fields)', () => {
|
|
bench('JSON.stringify', () => {
|
|
JSON.stringify(ticker);
|
|
});
|
|
bench('codec.encode (pooled)', () => {
|
|
wTicker.reset();
|
|
codecs.ticker.encode(wTicker, ticker);
|
|
});
|
|
});
|
|
|
|
describe('encode order (10 fields + bitset)', () => {
|
|
bench('JSON.stringify', () => {
|
|
JSON.stringify(order);
|
|
});
|
|
bench('codec.encode (pooled)', () => {
|
|
wOrder.reset();
|
|
codecs.order.encode(wOrder, order);
|
|
});
|
|
});
|
|
|
|
describe('encode book (1000 levels)', () => {
|
|
bench('JSON.stringify', () => {
|
|
JSON.stringify(book);
|
|
});
|
|
bench('codec.encode (pooled)', () => {
|
|
wBook.reset();
|
|
codecs.book.encode(wBook, book);
|
|
});
|
|
});
|
|
|
|
describe('decode ticker', () => {
|
|
bench('JSON.parse', () => {
|
|
JSON.parse(tickerJSON);
|
|
});
|
|
bench('codec.decode', () => {
|
|
const r = new Reader(tickerBin);
|
|
r.pos = 2;
|
|
codecs.ticker.decode(r);
|
|
});
|
|
});
|
|
|
|
describe('decode order', () => {
|
|
bench('JSON.parse', () => {
|
|
JSON.parse(orderJSON);
|
|
});
|
|
bench('codec.decode', () => {
|
|
const r = new Reader(orderBin);
|
|
r.pos = 2;
|
|
codecs.order.decode(r);
|
|
});
|
|
});
|
|
|
|
describe('decode book (1000 levels)', () => {
|
|
bench('JSON.parse', () => {
|
|
JSON.parse(bookJSON);
|
|
});
|
|
bench('codec.decode', () => {
|
|
const r = new Reader(bookBin);
|
|
r.pos = 2;
|
|
codecs.book.decode(r);
|
|
});
|
|
});
|
|
|
|
describe('roundtrip ticker', () => {
|
|
bench('JSON', () => {
|
|
JSON.parse(JSON.stringify(ticker));
|
|
});
|
|
bench('codec (pooled)', () => {
|
|
wTicker.reset();
|
|
codecs.ticker.encode(wTicker, ticker);
|
|
const r = new Reader(wTicker.bytes());
|
|
codecs.ticker.decode(r);
|
|
});
|
|
});
|
|
|
|
describe('serialize+deserialize ticker (with frame)', () => {
|
|
bench('JSON', () => {
|
|
JSON.parse(JSON.stringify(ticker));
|
|
});
|
|
bench('serialize/deserialize (framed)', () => {
|
|
deserialize(serialize(ticker, codecs.ticker));
|
|
});
|
|
});
|