Skip to content

assert is slow? #3091

@Uzlopak

Description

@Uzlopak

I have following benchmark for urlIsHttpHttpsScheme

import { bench, run } from 'mitata'
import { urlIsHttpHttpsScheme } from '../../lib/web/fetch/util.js'

const http = { protocol: 'http:' }
const https = { protocol: 'https:' }
const ftp = { protocol: 'ftp:' }
const ws = { protocol: 'ws:' }
const wss = { protocol: 'wss:' }
const mttp = { protocol: 'mttp:' }
const mttps = { protocol: 'mttps:' }
const htto = { protocol: 'htto:' }
const httos = { protocol: 'httos:' }

bench('urlIsHttpHttpsScheme "http:"', () => {
  urlIsHttpHttpsScheme(http)
})
bench('urlIsHttpHttpsScheme "https:"', () => {
  urlIsHttpHttpsScheme(https)
})
bench('urlIsHttpHttpsScheme "ftp:"', () => {
  urlIsHttpHttpsScheme(ftp)
})
bench('urlIsHttpHttpsScheme "ws:"', () => {
  urlIsHttpHttpsScheme(ws)
})
bench('urlIsHttpHttpsScheme "wss:"', () => {
  urlIsHttpHttpsScheme(wss)
})
bench('urlIsHttpHttpsScheme "mttp:"', () => {
  urlIsHttpHttpsScheme(mttp)
})
bench('urlIsHttpHttpsScheme "mttps:"', () => {
  urlIsHttpHttpsScheme(mttps)
})
bench('urlIsHttpHttpsScheme "htto:"', () => {
  urlIsHttpHttpsScheme(htto)
})
bench('urlIsHttpHttpsScheme "httos:"', () => {
  urlIsHttpHttpsScheme(httos)
})

await run()

If I run it against master I get:

benchmark                          time (avg)             (min … max)       p75       p99      p999
--------------------------------------------------------------------- -----------------------------
urlIsHttpHttpsScheme "http:"     1.49 ns/iter       (716 ps … 211 ns)    1.6 ns   1.88 ns   5.39 ns
urlIsHttpHttpsScheme "https:"    1.63 ns/iter      (920 ps … 34.2 ns)   1.64 ns   1.88 ns   5.56 ns
urlIsHttpHttpsScheme "ftp:"      1.47 ns/iter     (682 ps … 54.67 ns)    1.6 ns   1.84 ns   5.35 ns
urlIsHttpHttpsScheme "ws:"       1.48 ns/iter     (716 ps … 27.01 ns)    1.6 ns   1.67 ns   5.42 ns
urlIsHttpHttpsScheme "wss:"      1.47 ns/iter     (716 ps … 33.66 ns)    1.6 ns   1.67 ns   5.39 ns
urlIsHttpHttpsScheme "mttp:"     1.48 ns/iter       (682 ps … 454 ns)    1.6 ns   1.67 ns   6.55 ns
urlIsHttpHttpsScheme "mttps:"    1.47 ns/iter      (716 ps … 25.1 ns)    1.6 ns   1.67 ns   5.35 ns
urlIsHttpHttpsScheme "htto:"     1.76 ns/iter    (1.13 ns … 21.31 ns)   1.84 ns   2.08 ns   5.39 ns
urlIsHttpHttpsScheme "httos:"    1.64 ns/iter     (887 ps … 35.81 ns)   1.64 ns   2.11 ns   5.42 ns

If modifiy it to:

function urlIsHttpHttpsScheme (url) {
  if ('protocol' in url) {
    const protocol = url.protocol
  
    return protocol === 'http:' || protocol === 'https:'
  }
  assert('protocol' in url) // ensure it's a url object
}

I get:

benchmark                          time (avg)             (min … max)       p75       p99      p999
--------------------------------------------------------------------- -----------------------------
urlIsHttpHttpsScheme "http:"      732 ps/iter       (409 ps … 198 ns)    716 ps    955 ps   5.32 ns
urlIsHttpHttpsScheme "https:"     723 ps/iter     (409 ps … 51.05 ns)    716 ps    955 ps   6.48 ns
urlIsHttpHttpsScheme "ftp:"       719 ps/iter     (443 ps … 48.19 ns)    716 ps    955 ps   5.35 ns
urlIsHttpHttpsScheme "ws:"        718 ps/iter     (443 ps … 27.35 ns)    716 ps    955 ps   5.32 ns
urlIsHttpHttpsScheme "wss:"       718 ps/iter     (443 ps … 28.99 ns)    716 ps    955 ps   5.12 ns
urlIsHttpHttpsScheme "mttp:"      717 ps/iter     (443 ps … 53.17 ns)    716 ps    955 ps   4.67 ns
urlIsHttpHttpsScheme "mttps:"     721 ps/iter     (443 ps … 30.73 ns)    716 ps    955 ps   6.58 ns
urlIsHttpHttpsScheme "htto:"      717 ps/iter     (443 ps … 28.88 ns)    716 ps    955 ps   5.15 ns
urlIsHttpHttpsScheme "httos:"     721 ps/iter       (239 ps … 149 ns)    716 ps    955 ps   5.15 ns

conjecture: assert slows down.

Metadata

Metadata

Assignees

Labels

Performancefeatures or fixes related to performance

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions