Skip to content

Commit f4e62b5

Browse files
authored
test: add some benchmarks (#257)
1 parent 639e714 commit f4e62b5

File tree

9 files changed

+875
-3
lines changed

9 files changed

+875
-3
lines changed

.github/workflows/ci.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,9 @@ jobs:
2626
- run: pnpm build
2727
- run: pnpm vitest --coverage
2828
- run: pnpm tsc --noEmit
29+
- name: Run benchmarks
30+
if: matrix.os == 'ubuntu-latest'
31+
uses: CodSpeedHQ/action@v3
32+
with:
33+
run: pnpm bench
2934
- uses: codecov/codecov-action@v5
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
{
2+
"entry-client.ts": {
3+
"file": "assets/entry-client.js",
4+
"src": "entry-client.ts",
5+
"isEntry": true,
6+
"imports": [
7+
"_vendor.js"
8+
],
9+
"css": ["assets/main.css", "assets/components.css"],
10+
"dynamicImports": [
11+
"pages/home.vue",
12+
"pages/about.vue",
13+
"pages/contact.vue",
14+
"pages/blog.vue",
15+
"pages/profile.vue"
16+
],
17+
"assets": [
18+
"assets/logo.svg",
19+
"assets/banner.jpg"
20+
]
21+
},
22+
"_vendor.js": {
23+
"file": "assets/vendor.js"
24+
},
25+
"pages/home.vue": {
26+
"file": "assets/home.js",
27+
"src": "pages/home.vue",
28+
"isDynamicEntry": true,
29+
"imports": [
30+
"_vendor.js",
31+
"entry-client.ts"
32+
],
33+
"css": [
34+
"assets/home.css"
35+
],
36+
"assets": [
37+
"assets/hero-bg.jpg"
38+
]
39+
},
40+
"pages/about.vue": {
41+
"file": "assets/about.js",
42+
"src": "pages/about.vue",
43+
"isDynamicEntry": true,
44+
"imports": [
45+
"entry-client.ts"
46+
],
47+
"dynamicImports": [
48+
"components/Timeline.vue",
49+
"components/TeamMember.vue"
50+
],
51+
"css": [
52+
"assets/about.css"
53+
]
54+
},
55+
"pages/contact.vue": {
56+
"file": "assets/contact.js",
57+
"src": "pages/contact.vue",
58+
"isDynamicEntry": true,
59+
"imports": [
60+
"_vendor.js",
61+
"entry-client.ts"
62+
],
63+
"css": [
64+
"assets/contact.css",
65+
"assets/forms.css"
66+
]
67+
},
68+
"pages/blog.vue": {
69+
"file": "assets/blog.js",
70+
"src": "pages/blog.vue",
71+
"isDynamicEntry": true,
72+
"imports": [
73+
"_vendor.js"
74+
],
75+
"dynamicImports": [
76+
"components/BlogPost.vue",
77+
"components/Pagination.vue",
78+
"components/SearchBox.vue"
79+
],
80+
"css": [
81+
"assets/blog.css"
82+
]
83+
},
84+
"pages/profile.vue": {
85+
"file": "assets/profile.js",
86+
"src": "pages/profile.vue",
87+
"isDynamicEntry": true,
88+
"imports": [
89+
"_vendor.js",
90+
"entry-client.ts"
91+
],
92+
"css": [
93+
"assets/profile.css"
94+
]
95+
},
96+
"components/Timeline.vue": {
97+
"file": "assets/timeline.js",
98+
"src": "components/Timeline.vue",
99+
"isDynamicEntry": true,
100+
"imports": [
101+
"_vendor.js"
102+
],
103+
"css": [
104+
"assets/timeline.css"
105+
]
106+
},
107+
"components/TeamMember.vue": {
108+
"file": "assets/team-member.js",
109+
"src": "components/TeamMember.vue",
110+
"isDynamicEntry": true,
111+
"imports": [
112+
"_vendor.js"
113+
],
114+
"css": [
115+
"assets/team-member.css"
116+
]
117+
},
118+
"components/BlogPost.vue": {
119+
"file": "assets/blog-post.js",
120+
"src": "components/BlogPost.vue",
121+
"isDynamicEntry": true,
122+
"imports": [
123+
"_vendor.js"
124+
],
125+
"css": [
126+
"assets/blog-post.css"
127+
]
128+
},
129+
"components/Pagination.vue": {
130+
"file": "assets/pagination.js",
131+
"src": "components/Pagination.vue",
132+
"isDynamicEntry": true,
133+
"imports": [
134+
"_vendor.js"
135+
],
136+
"css": [
137+
"assets/pagination.css"
138+
]
139+
},
140+
"components/SearchBox.vue": {
141+
"file": "assets/search-box.js",
142+
"src": "components/SearchBox.vue",
143+
"isDynamicEntry": true,
144+
"imports": [
145+
"_vendor.js"
146+
],
147+
"css": [
148+
"assets/search-box.css"
149+
]
150+
}
151+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
{
2+
"publicPath": "/_nuxt/",
3+
"all": [
4+
"runtime.js",
5+
"commons/app.js",
6+
"commons/vendor.js",
7+
"commons/polyfills.js",
8+
"app.css",
9+
"app.js",
10+
"pages/home.css",
11+
"pages/home.js",
12+
"pages/about.css",
13+
"pages/about.js",
14+
"pages/contact.css",
15+
"pages/contact.js",
16+
"pages/blog.css",
17+
"pages/blog.js",
18+
"pages/profile.css",
19+
"pages/profile.js",
20+
"components/timeline.css",
21+
"components/timeline.js",
22+
"components/team-member.css",
23+
"components/team-member.js",
24+
"components/blog-post.css",
25+
"components/blog-post.js",
26+
"components/pagination.css",
27+
"components/pagination.js",
28+
"components/search-box.css",
29+
"components/search-box.js",
30+
"assets/main.css",
31+
"assets/forms.css",
32+
"img/logo.svg",
33+
"img/hero-bg.jpg",
34+
"img/banner.jpg",
35+
"fonts/inter.woff2",
36+
"fonts/inter-bold.woff2"
37+
],
38+
"initial": [
39+
"runtime.js",
40+
"commons/polyfills.js",
41+
"commons/vendor.js",
42+
"commons/app.js",
43+
"app.css",
44+
"assets/main.css",
45+
"app.js"
46+
],
47+
"async": [
48+
"pages/home.css",
49+
"pages/home.js",
50+
"pages/about.css",
51+
"pages/about.js",
52+
"pages/contact.css",
53+
"pages/contact.js",
54+
"pages/blog.css",
55+
"pages/blog.js",
56+
"pages/profile.css",
57+
"pages/profile.js",
58+
"components/timeline.css",
59+
"components/timeline.js",
60+
"components/team-member.css",
61+
"components/team-member.js",
62+
"components/blog-post.css",
63+
"components/blog-post.js",
64+
"components/pagination.css",
65+
"components/pagination.js",
66+
"components/search-box.css",
67+
"components/search-box.js",
68+
"assets/forms.css"
69+
],
70+
"modules": {
71+
"4d87aad8": [1, 6],
72+
"630f1d84": [2, 6],
73+
"56940b2e": [7, 8, 26, 28],
74+
"ab12cd34": [9, 10, 16],
75+
"ef56gh78": [11, 12, 27],
76+
"ij90kl12": [13, 14],
77+
"mn34op56": [15, 16],
78+
"qr78st90": [17, 18],
79+
"uv12wx34": [19, 20],
80+
"yz56ab78": [21, 22],
81+
"cd90ef12": [23, 24],
82+
"gh34ij56": [25, 26]
83+
}
84+
}

benchmark/utils.bench.ts

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
import { bench, describe } from 'vitest'
2+
import { isJS, isCSS, getAsType, parseResource } from '../src/utils'
3+
import { extname } from 'node:path'
4+
5+
// Sample file names for testing
6+
const jsFiles = [
7+
'app.js',
8+
'vendor.mjs',
9+
'chunk.cjs',
10+
'module.js?v=123',
11+
'script',
12+
]
13+
14+
const cssFiles = [
15+
'main.css',
16+
'components.scss',
17+
'styles.less',
18+
'theme.stylus',
19+
'layout.css?v=456',
20+
]
21+
22+
const assetFiles = [
23+
'logo.svg',
24+
'banner.jpg',
25+
'icon.png',
26+
'font.woff2',
27+
'video.mp4',
28+
'audio.mp3',
29+
'document.pdf',
30+
]
31+
32+
const mixedFiles = [...jsFiles, ...cssFiles, ...assetFiles]
33+
34+
describe('File Type Detection Benchmarks', () => {
35+
bench('isJS detection on JS files', () => {
36+
for (const file of jsFiles) {
37+
isJS(file)
38+
}
39+
})
40+
41+
bench('isJS detection on mixed files', () => {
42+
for (const file of mixedFiles) {
43+
isJS(file)
44+
}
45+
})
46+
47+
bench('isCSS detection on CSS files', () => {
48+
for (const file of cssFiles) {
49+
isCSS(file)
50+
}
51+
})
52+
53+
bench('isCSS detection on mixed files', () => {
54+
for (const file of mixedFiles) {
55+
isCSS(file)
56+
}
57+
})
58+
})
59+
60+
describe('Asset Type Detection Benchmarks', () => {
61+
bench('getAsType on mixed files', () => {
62+
for (const file of mixedFiles) {
63+
const base = file.split('?', 1)[0]
64+
const ext = extname(base).slice(1)
65+
getAsType(ext)
66+
}
67+
})
68+
69+
bench('getAsType on JS extensions', () => {
70+
const extensions = ['js', 'mjs', 'cjs']
71+
for (const ext of extensions) {
72+
getAsType(ext)
73+
}
74+
})
75+
76+
bench('getAsType on CSS extensions', () => {
77+
const extensions = ['css', 'scss', 'less', 'stylus']
78+
for (const ext of extensions) {
79+
getAsType(ext)
80+
}
81+
})
82+
})
83+
84+
describe('Resource Parsing Benchmarks', () => {
85+
bench('parseResource on JS files', () => {
86+
for (const file of jsFiles) {
87+
parseResource(file)
88+
}
89+
})
90+
91+
bench('parseResource on CSS files', () => {
92+
for (const file of cssFiles) {
93+
parseResource(file)
94+
}
95+
})
96+
97+
bench('parseResource on asset files', () => {
98+
for (const file of assetFiles) {
99+
parseResource(file)
100+
}
101+
})
102+
103+
bench('parseResource on mixed files', () => {
104+
for (const file of mixedFiles) {
105+
parseResource(file)
106+
}
107+
})
108+
109+
bench('parseResource on mixed files (1000 iterations)', () => {
110+
for (let i = 0; i < 1000; i++) {
111+
for (const file of mixedFiles) {
112+
parseResource(file)
113+
}
114+
}
115+
})
116+
})
117+
118+
// Test with dynamically generated file names
119+
describe('Dynamic File Generation Benchmarks', () => {
120+
bench('parseResource on generated JS files', () => {
121+
for (let i = 0; i < 100; i++) {
122+
parseResource(`chunk-${i}.js`)
123+
parseResource(`module-${i}.mjs`)
124+
parseResource(`bundle-${i}.cjs`)
125+
}
126+
})
127+
128+
bench('parseResource on generated CSS files', () => {
129+
for (let i = 0; i < 100; i++) {
130+
parseResource(`styles-${i}.css`)
131+
parseResource(`theme-${i}.scss`)
132+
parseResource(`layout-${i}.less`)
133+
}
134+
})
135+
136+
bench('parseResource on generated assets', () => {
137+
for (let i = 0; i < 100; i++) {
138+
parseResource(`image-${i}.png`)
139+
parseResource(`icon-${i}.svg`)
140+
parseResource(`font-${i}.woff2`)
141+
}
142+
})
143+
})

0 commit comments

Comments
 (0)