Skip to main content
Glama
bench.js7.89 kB
'use strict' const path = require('path') const { Worker } = require('worker_threads') const BENCH_THREAD_PATH = path.join(__dirname, 'bench-thread.js') const LONG_STRING_LENGTH = 1e4 const SHORT_ARRAY_SIZE = 1e3 const shortArrayOfNumbers = new Array(SHORT_ARRAY_SIZE) const shortArrayOfIntegers = new Array(SHORT_ARRAY_SIZE) const shortArrayOfShortStrings = new Array(SHORT_ARRAY_SIZE) const shortArrayOfLongStrings = new Array(SHORT_ARRAY_SIZE) const shortArrayOfMultiObject = new Array(SHORT_ARRAY_SIZE) function getRandomInt (max) { return Math.floor(Math.random() * max) } let longSimpleString = '' for (let i = 0; i < LONG_STRING_LENGTH; i++) { longSimpleString += i } let longString = '' for (let i = 0; i < LONG_STRING_LENGTH; i++) { longString += i if (i % 100 === 0) { longString += '"' } } for (let i = 0; i < SHORT_ARRAY_SIZE; i++) { shortArrayOfNumbers[i] = getRandomInt(1000) shortArrayOfIntegers[i] = getRandomInt(1000) shortArrayOfShortStrings[i] = 'hello world' shortArrayOfLongStrings[i] = longString shortArrayOfMultiObject[i] = { s: 'hello world', n: 42, b: true } } const benchmarks = [ { name: 'short string', schema: { type: 'string' }, input: 'hello world' }, { name: 'unsafe short string', schema: { type: 'string', format: 'unsafe' }, input: 'hello world' }, { name: 'short string with double quote', schema: { type: 'string' }, input: 'hello " world' }, { name: 'long string without double quotes', schema: { type: 'string' }, input: longSimpleString }, { name: 'unsafe long string without double quotes', schema: { type: 'string', format: 'unsafe' }, input: longSimpleString }, { name: 'long string', schema: { type: 'string' }, input: longString }, { name: 'unsafe long string', schema: { type: 'string', format: 'unsafe' }, input: longString }, { name: 'number', schema: { type: 'number' }, input: 42 }, { name: 'integer', schema: { type: 'integer' }, input: 42 }, { name: 'formatted date-time', schema: { type: 'string', format: 'date-time' }, input: new Date() }, { name: 'formatted date', schema: { type: 'string', format: 'date' }, input: new Date() }, { name: 'formatted time', schema: { type: 'string', format: 'time' }, input: new Date() }, { name: 'short array of numbers', schema: { type: 'array', items: { type: 'number' } }, input: shortArrayOfNumbers }, { name: 'short array of integers', schema: { type: 'array', items: { type: 'integer' } }, input: shortArrayOfIntegers }, { name: 'short array of short strings', schema: { type: 'array', items: { type: 'string' } }, input: shortArrayOfShortStrings }, { name: 'short array of long strings', schema: { type: 'array', items: { type: 'string' } }, input: shortArrayOfShortStrings }, { name: 'short array of objects with properties of different types', schema: { type: 'array', items: { type: 'object', properties: { s: { type: 'string' }, n: { type: 'number' }, b: { type: 'boolean' } } } }, input: shortArrayOfMultiObject }, { name: 'object with number property', schema: { type: 'object', properties: { a: { type: 'number' } } }, input: { a: 42 } }, { name: 'object with integer property', schema: { type: 'object', properties: { a: { type: 'integer' } } }, input: { a: 42 } }, { name: 'object with short string property', schema: { type: 'object', properties: { a: { type: 'string' } } }, input: { a: 'hello world' } }, { name: 'object with long string property', schema: { type: 'object', properties: { a: { type: 'string' } } }, input: { a: longString } }, { name: 'object with properties of different types', schema: { type: 'object', properties: { s1: { type: 'string' }, n1: { type: 'number' }, b1: { type: 'boolean' }, s2: { type: 'string' }, n2: { type: 'number' }, b2: { type: 'boolean' }, s3: { type: 'string' }, n3: { type: 'number' }, b3: { type: 'boolean' }, s4: { type: 'string' }, n4: { type: 'number' }, b4: { type: 'boolean' }, s5: { type: 'string' }, n5: { type: 'number' }, b5: { type: 'boolean' } } }, input: { s1: 'hello world', n1: 42, b1: true, s2: 'hello world', n2: 42, b2: true, s3: 'hello world', n3: 42, b3: true, s4: 'hello world', n4: 42, b4: true, s5: 'hello world', n5: 42, b5: true } }, { name: 'simple object', schema: { title: 'Example Schema', type: 'object', properties: { firstName: { type: 'string' }, lastName: { type: ['string', 'null'] }, age: { description: 'Age in years', type: 'integer', minimum: 0 } } }, input: { firstName: 'Max', lastName: 'Power', age: 22 } }, { name: 'simple object with required fields', schema: { title: 'Example Schema', type: 'object', properties: { firstName: { type: 'string' }, lastName: { type: ['string', 'null'] }, age: { description: 'Age in years', type: 'integer', minimum: 0 } }, required: ['firstName', 'lastName', 'age'] }, input: { firstName: 'Max', lastName: 'Power', age: 22 } }, { name: 'object with const string property', schema: { type: 'object', properties: { a: { const: 'const string' } } }, input: { a: 'const string' } }, { name: 'object with const number property', schema: { type: 'object', properties: { a: { const: 1 } } }, input: { a: 1 } }, { name: 'object with const bool property', schema: { type: 'object', properties: { a: { const: true } } }, input: { a: true } }, { name: 'object with const object property', schema: { type: 'object', properties: { foo: { const: { bar: 'baz' } } } }, input: { foo: { bar: 'baz' } } }, { name: 'object with const null property', schema: { type: 'object', properties: { foo: { const: null } } }, input: { foo: null } } ] async function runBenchmark (benchmark) { const worker = new Worker(BENCH_THREAD_PATH, { workerData: benchmark }) return new Promise((resolve, reject) => { let result = null worker.on('error', reject) worker.on('message', (benchResult) => { result = benchResult }) worker.on('exit', (code) => { if (code === 0) { resolve(result) } else { reject(new Error(`Worker stopped with exit code ${code}`)) } }) }) } async function runBenchmarks () { let maxNameLength = 0 for (const benchmark of benchmarks) { maxNameLength = Math.max(benchmark.name.length, maxNameLength) } for (const benchmark of benchmarks) { benchmark.name = benchmark.name.padEnd(maxNameLength, '.') const resultMessage = await runBenchmark(benchmark) console.log(resultMessage) } } runBenchmarks()

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/krtw00/search-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server