Skip to content

Function: Profiling and performance

Every function response includes profiling data with phase-level timing and resource usage.

Profiling

const microlink = require('@microlink/function')

const fn = microlink(({ page }) => page.title())
const result = await fn('https://example.com')

console.log(result.profiling)
// {
//   phases: { install: 0, build: 120, spawn: 45, run: 890, total: 1055 },
//   cpu: 234,
//   memory: 8,
//   size: 156
// }
FieldDescription
phases.installTime spent installing npm dependencies (0 when none are used)
phases.buildTime spent bundling the function code
phases.spawnTime spent starting the isolated process
phases.runTime spent executing the function
phases.totalWall-clock time from start to finish
cpuPeak CPU time in milliseconds
memoryPeak memory usage in MB
sizeBundled code size in bytes
Use profiling to understand where time is spent. If install is high, your dependencies are being installed for the first time — subsequent runs use the cache. If run is high, the function itself is doing heavy work.

Plan limits

The function parameter is available on both free and pro plans:
FreePro
Timeout5 secondsUp to 28 seconds
Memory16 MB32 MB
Code size1024 bytesUnlimited
Concurrency1 per IPUnlimited
The free plan is enough to prototype workflows and run the examples in this guide. For production workloads that need more time or memory, or parameters such as headers, proxy, ttl, or staleTtl, use a pro plan.
To authenticate, pass your API key:
const microlink = require('@microlink/function')

const fn = microlink(
  ({ page }) => page.title(),
  {},
  { headers: { 'x-api-key': 'YOUR_API_KEY' } }
)

const result = await fn('https://example.com')
See the authentication and rate limit docs for endpoint and quota details.

Skip metadata

Most function-only workflows do not need normalized metadata. Set meta: false to skip it:
const microlink = require('@microlink/function')

const fn = microlink(({ page }) => page.title(), { meta: false })
const result = await fn('https://example.com')
Disabling metadata is usually the biggest speedup for function requests. If you still need the rendered markup, call page.content() inside the function.

Compress large functions

When using MQL directly, large function bodies can be compressed before sending. The @microlink/function library handles compression automatically, but if you prefer the raw MQL approach:
const { compressToURI } = require('lz-ts')
const mql = require('@microlink/mql')

const code = ({ page }) => page.title()

const { data } = await mql('https://example.com', {
  function: `lz#${compressToURI(code.toString())}`,
  meta: false
})

console.log(data.function.value)
Prefix the compressed payload with the algorithm alias: lz# for lz-string, br# for brotli, gz# for gzip.

Optimization checklist

  1. Set meta: false unless you need normalized metadata — this is usually the biggest win.
  2. Use page.title() and page.$eval() instead of page.evaluate() when possible — they are faster and easier to debug.
  3. Replace fixed waits like page.waitForTimeout(3000) with page.waitForSelector() — they resolve as soon as the element appears.
  4. Check result.profiling.phases to find the bottleneck — a high install on first run is normal, but a high run means the function itself needs work.
  5. Minimize dependencies — each require() adds install and build time. Use only what you need.

See also