diff --git a/benchmarks/utils/.gitignore b/benchmarks/utils/.gitignore new file mode 100644 index 000000000..86093ba42 --- /dev/null +++ b/benchmarks/utils/.gitignore @@ -0,0 +1,2 @@ +yarn.lock +bun.lockb \ No newline at end of file diff --git a/benchmarks/utils/package.json b/benchmarks/utils/package.json new file mode 100644 index 000000000..76ebe2337 --- /dev/null +++ b/benchmarks/utils/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "mitata": "^0.1.11" + } +} \ No newline at end of file diff --git a/benchmarks/utils/src/get-path.ts b/benchmarks/utils/src/get-path.ts new file mode 100644 index 000000000..f405338ae --- /dev/null +++ b/benchmarks/utils/src/get-path.ts @@ -0,0 +1,20 @@ +import { run, group, bench } from 'mitata' + +bench('noop', () => {}) + +const request = new Request('http://localhost/about/me') + +group('getPath', () => { + bench('slice + indexOf', () => { + const url = request.url + const queryIndex = url.indexOf('?', 8) + url.slice(url.indexOf('/', 8), queryIndex === -1 ? undefined : queryIndex) + }) + + bench('regexp', () => { + const match = request.url.match(/^https?:\/\/[^/]+(\/[^?]*)/) + match ? match[1] : '' + }) +}) + +run() diff --git a/deno_dist/utils/url.ts b/deno_dist/utils/url.ts index 86daf2bf5..b37a5539a 100644 --- a/deno_dist/utils/url.ts +++ b/deno_dist/utils/url.ts @@ -70,9 +70,10 @@ export const getPattern = (label: string): Pattern | null => { } export const getPath = (request: Request): string => { - // Optimized: RegExp is faster than indexOf() + slice() - const match = request.url.match(/^https?:\/\/[^/]+(\/[^?]*)/) - return match ? match[1] : '' + // Optimized: indexOf() + slice() is faster than RegExp + const url = request.url + const queryIndex = url.indexOf('?', 8) + return url.slice(url.indexOf('/', 8), queryIndex === -1 ? undefined : queryIndex) } export const getQueryStrings = (url: string): string => { diff --git a/src/utils/url.ts b/src/utils/url.ts index 86daf2bf5..b37a5539a 100644 --- a/src/utils/url.ts +++ b/src/utils/url.ts @@ -70,9 +70,10 @@ export const getPattern = (label: string): Pattern | null => { } export const getPath = (request: Request): string => { - // Optimized: RegExp is faster than indexOf() + slice() - const match = request.url.match(/^https?:\/\/[^/]+(\/[^?]*)/) - return match ? match[1] : '' + // Optimized: indexOf() + slice() is faster than RegExp + const url = request.url + const queryIndex = url.indexOf('?', 8) + return url.slice(url.indexOf('/', 8), queryIndex === -1 ? undefined : queryIndex) } export const getQueryStrings = (url: string): string => {