Skip to content

Commit badd832

Browse files
committed
test: add some benchmarks
1 parent 639e714 commit badd832

File tree

9 files changed

+873
-3
lines changed

9 files changed

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

0 commit comments

Comments
 (0)