Skip to content

Commit 56a8ceb

Browse files
committed
test: improve benchmarks
1 parent f4e62b5 commit 56a8ceb

File tree

4 files changed

+133
-55
lines changed

4 files changed

+133
-55
lines changed

benchmark/renderer.bench.ts

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import { bench, describe } from 'vitest'
2+
import { createRenderer, renderStyles, renderScripts, renderResourceHints } from '../src/runtime'
3+
import { normalizeViteManifest, normalizeWebpackManifest } from '../src'
4+
5+
import viteManifest from '../test/fixtures/vite-manifest.json'
6+
import webpackManifest from '../test/fixtures/webpack-manifest.json'
7+
import largeViteManifest from './fixtures/large-vite-manifest.json'
8+
9+
describe('createRenderer', () => {
10+
bench('vite', () => {
11+
createRenderer(() => ({}), {
12+
manifest: normalizeViteManifest(viteManifest),
13+
renderToString: () => '<div>test</div>',
14+
})
15+
})
16+
17+
bench('webpack', () => {
18+
createRenderer(() => ({}), {
19+
manifest: normalizeWebpackManifest(webpackManifest),
20+
renderToString: () => '<div>test</div>',
21+
})
22+
})
23+
24+
bench('vite (large)', () => {
25+
createRenderer(() => ({}), {
26+
manifest: normalizeViteManifest(largeViteManifest),
27+
renderToString: () => '<div>test</div>',
28+
})
29+
})
30+
})
31+
32+
describe('rendering', () => {
33+
const viteRenderer = createRenderer(() => ({}), {
34+
manifest: normalizeViteManifest(viteManifest),
35+
renderToString: () => '<div>test</div>',
36+
})
37+
38+
const webpackRenderer = createRenderer(() => ({}), {
39+
manifest: normalizeWebpackManifest(webpackManifest),
40+
renderToString: () => '<div>test</div>',
41+
})
42+
43+
const largeViteRenderer = createRenderer(() => ({}), {
44+
manifest: normalizeViteManifest(largeViteManifest),
45+
renderToString: () => '<div>test</div>',
46+
})
47+
48+
// Get actual module keys from manifests
49+
const viteModules = Object.keys(viteManifest)
50+
const webpackModules = Object.keys(webpackManifest)
51+
const largeViteModules = Object.keys(largeViteManifest)
52+
53+
// Small module sets
54+
const smallViteSet = new Set(viteModules.slice(0, 2))
55+
const smallWebpackSet = new Set(webpackModules.slice(0, 2))
56+
57+
// Large module sets
58+
const largeViteSet = new Set(viteModules)
59+
const largeLargeViteSet = new Set(largeViteModules.slice(0, 50))
60+
61+
bench('renderStyles - vite (small)', () => {
62+
renderStyles({ modules: smallViteSet }, viteRenderer.rendererContext)
63+
})
64+
65+
bench('renderStyles - vite (large)', () => {
66+
renderStyles({ modules: largeViteSet }, viteRenderer.rendererContext)
67+
})
68+
69+
bench('renderStyles - vite (very large)', () => {
70+
renderStyles({ modules: largeLargeViteSet }, largeViteRenderer.rendererContext)
71+
})
72+
73+
bench('renderScripts - vite (small)', () => {
74+
renderScripts({ modules: smallViteSet }, viteRenderer.rendererContext)
75+
})
76+
77+
bench('renderScripts - vite (large)', () => {
78+
renderScripts({ modules: largeViteSet }, viteRenderer.rendererContext)
79+
})
80+
81+
bench('renderScripts - vite (very large)', () => {
82+
renderScripts({ modules: largeLargeViteSet }, largeViteRenderer.rendererContext)
83+
})
84+
85+
bench('renderResourceHints - vite (small)', () => {
86+
renderResourceHints({ modules: smallViteSet }, viteRenderer.rendererContext)
87+
})
88+
89+
bench('renderResourceHints - vite (large)', () => {
90+
renderResourceHints({ modules: largeViteSet }, viteRenderer.rendererContext)
91+
})
92+
93+
bench('renderResourceHints - vite (very large)', () => {
94+
renderResourceHints({ modules: largeLargeViteSet }, largeViteRenderer.rendererContext)
95+
})
96+
97+
bench('renderStyles - webpack', () => {
98+
renderStyles({ modules: smallWebpackSet }, webpackRenderer.rendererContext)
99+
})
100+
101+
bench('renderScripts - webpack', () => {
102+
renderScripts({ modules: smallWebpackSet }, webpackRenderer.rendererContext)
103+
})
104+
105+
bench('renderResourceHints - webpack', () => {
106+
renderResourceHints({ modules: smallWebpackSet }, webpackRenderer.rendererContext)
107+
})
108+
})

benchmark/utils.bench.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const assetFiles = [
3131

3232
const mixedFiles = [...jsFiles, ...cssFiles, ...assetFiles]
3333

34-
describe('File Type Detection Benchmarks', () => {
34+
describe('file type detection', () => {
3535
bench('isJS detection on JS files', () => {
3636
for (const file of jsFiles) {
3737
isJS(file)
@@ -57,7 +57,7 @@ describe('File Type Detection Benchmarks', () => {
5757
})
5858
})
5959

60-
describe('Asset Type Detection Benchmarks', () => {
60+
describe('asset type detection', () => {
6161
bench('getAsType on mixed files', () => {
6262
for (const file of mixedFiles) {
6363
const base = file.split('?', 1)[0]
@@ -81,7 +81,7 @@ describe('Asset Type Detection Benchmarks', () => {
8181
})
8282
})
8383

84-
describe('Resource Parsing Benchmarks', () => {
84+
describe('resource parsing', () => {
8585
bench('parseResource on JS files', () => {
8686
for (const file of jsFiles) {
8787
parseResource(file)
@@ -116,7 +116,7 @@ describe('Resource Parsing Benchmarks', () => {
116116
})
117117

118118
// Test with dynamically generated file names
119-
describe('Dynamic File Generation Benchmarks', () => {
119+
describe('dynamic file generation', () => {
120120
bench('parseResource on generated JS files', () => {
121121
for (let i = 0; i < 100; i++) {
122122
parseResource(`chunk-${i}.js`)

benchmark/vite.bench.ts

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,16 @@
1-
import { readFileSync } from 'node:fs'
2-
import { resolve } from 'node:path'
31
import { bench, describe } from 'vitest'
42
import { normalizeViteManifest } from '../src/vite'
53
import type { Manifest as ViteManifest } from 'vite'
64

7-
// Load test fixtures
8-
const smallViteManifest = JSON.parse(
9-
readFileSync(resolve(__dirname, '../test/fixtures/vite-manifest.json'), 'utf-8'),
10-
) as ViteManifest
5+
import smallViteManifest from '../test/fixtures/vite-manifest.json'
6+
import largeViteManifest from './fixtures/large-vite-manifest.json'
117

12-
const largeViteManifest = JSON.parse(
13-
readFileSync(resolve(__dirname, 'fixtures/large-vite-manifest.json'), 'utf-8'),
14-
) as ViteManifest
15-
16-
describe('Vite Manifest Normalization Benchmarks', () => {
17-
bench('normalize small Vite manifest', () => {
8+
describe('normalizeViteManifest', () => {
9+
bench('small', () => {
1810
normalizeViteManifest(smallViteManifest)
1911
})
2012

21-
bench('normalize large Vite manifest', () => {
13+
bench('large', () => {
2214
normalizeViteManifest(largeViteManifest)
2315
})
2416

@@ -70,14 +62,12 @@ describe('Vite Manifest Normalization Benchmarks', () => {
7062

7163
const complexViteManifest = createComplexViteManifest()
7264

73-
bench('normalize complex nested Vite manifest', () => {
65+
bench('complex', () => {
7466
normalizeViteManifest(complexViteManifest)
7567
})
7668
})
7769

78-
// Benchmark with different manifest sizes
79-
describe('Vite Manifest Size Scaling', () => {
80-
// Generate manifests of different sizes
70+
describe('normalizeViteManifest scaling', () => {
8171
const generateManifest = (entryCount: number): ViteManifest => {
8272
const manifest: ViteManifest = {}
8373

@@ -110,22 +100,22 @@ describe('Vite Manifest Size Scaling', () => {
110100
}
111101

112102
const manifest5 = generateManifest(5)
113-
bench('normalize 5 entries', () => {
103+
bench('5 entries', () => {
114104
normalizeViteManifest(manifest5)
115105
})
116106

117107
const manifest25 = generateManifest(25)
118-
bench('normalize 25 entries', () => {
108+
bench('25 entries', () => {
119109
normalizeViteManifest(manifest25)
120110
})
121111

122112
const manifest50 = generateManifest(50)
123-
bench('normalize 50 entries', () => {
113+
bench('50 entries', () => {
124114
normalizeViteManifest(manifest50)
125115
})
126116

127117
const manifest100 = generateManifest(100)
128-
bench('normalize 100 entries', () => {
118+
bench('100 entries', () => {
129119
normalizeViteManifest(manifest100)
130120
})
131121
})

benchmark/webpack.bench.ts

Lines changed: 10 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,21 @@
1-
import { readFileSync } from 'node:fs'
2-
import { resolve } from 'node:path'
31
import { bench, describe } from 'vitest'
42
import { normalizeWebpackManifest, type WebpackClientManifest } from '../src/webpack'
53

6-
// Load test fixtures
7-
const smallWebpackManifest = JSON.parse(
8-
readFileSync(resolve(__dirname, '../test/fixtures/webpack-manifest.json'), 'utf-8'),
9-
) as WebpackClientManifest
4+
import smallWebpackManifest from '../test/fixtures/webpack-manifest.json'
5+
import largeWebpackManifest from './fixtures/large-webpack-manifest.json'
106

11-
const largeWebpackManifest = JSON.parse(
12-
readFileSync(resolve(__dirname, 'fixtures/large-webpack-manifest.json'), 'utf-8'),
13-
) as WebpackClientManifest
14-
15-
describe('Webpack Manifest Normalization Benchmarks', () => {
16-
bench('normalize small Webpack manifest', () => {
7+
describe('normalizeWebpackManifest', () => {
8+
bench('small', () => {
179
normalizeWebpackManifest(smallWebpackManifest)
1810
})
1911

20-
bench('normalize large Webpack manifest', () => {
12+
bench('large', () => {
2113
normalizeWebpackManifest(largeWebpackManifest)
2214
})
23-
24-
bench('normalize small Webpack manifest (100 iterations)', () => {
25-
for (let i = 0; i < 100; i++) {
26-
normalizeWebpackManifest(smallWebpackManifest)
27-
}
28-
})
29-
30-
bench('normalize large Webpack manifest (10 iterations)', () => {
31-
for (let i = 0; i < 10; i++) {
32-
normalizeWebpackManifest(largeWebpackManifest)
33-
}
34-
})
3515
})
3616

3717
// Benchmark with different manifest sizes
38-
describe('Webpack Manifest Size Scaling', () => {
18+
describe('normalizeWebpackManifest scaling', () => {
3919
// Generate manifests of different sizes
4020
const generateManifest = (entryCount: number): WebpackClientManifest => {
4121
const all: string[] = ['runtime.js', 'commons/app.js', 'app.css', 'app.js']
@@ -65,22 +45,22 @@ describe('Webpack Manifest Size Scaling', () => {
6545
}
6646

6747
const manifest5 = generateManifest(5)
68-
bench('normalize 5 entries', () => {
48+
bench('5 entries', () => {
6949
normalizeWebpackManifest(manifest5)
7050
})
7151

7252
const manifest25 = generateManifest(25)
73-
bench('normalize 25 entries', () => {
53+
bench('25 entries', () => {
7454
normalizeWebpackManifest(manifest25)
7555
})
7656

7757
const manifest50 = generateManifest(50)
78-
bench('normalize 50 entries', () => {
58+
bench('50 entries', () => {
7959
normalizeWebpackManifest(manifest50)
8060
})
8161

8262
const manifest100 = generateManifest(100)
83-
bench('normalize 100 entries', () => {
63+
bench('100 entries', () => {
8464
normalizeWebpackManifest(manifest100)
8565
})
8666
})

0 commit comments

Comments
 (0)