diff --git a/bench/minimal-server/benchmark-app/app/layout.js b/bench/minimal-server/benchmark-app/app/layout.js
new file mode 100644
index 0000000000000..bf15eff980a84
--- /dev/null
+++ b/bench/minimal-server/benchmark-app/app/layout.js
@@ -0,0 +1,10 @@
+import * as React from 'react'
+
+export default function Root({ children }) {
+ return (
+
+
+ {children}
+
+ )
+}
diff --git a/bench/minimal-server/benchmark-app/app/rsc/page.js b/bench/minimal-server/benchmark-app/app/rsc/page.js
new file mode 100644
index 0000000000000..395757bacd944
--- /dev/null
+++ b/bench/minimal-server/benchmark-app/app/rsc/page.js
@@ -0,0 +1,5 @@
+import * as React from 'react'
+
+export default function page() {
+ return hello
+}
diff --git a/bench/minimal-server/benchmark-app/next.config.js b/bench/minimal-server/benchmark-app/next.config.js
new file mode 100644
index 0000000000000..cfa3ac3d7aa94
--- /dev/null
+++ b/bench/minimal-server/benchmark-app/next.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ experimental: {
+ appDir: true,
+ },
+}
diff --git a/bench/minimal-server/benchmark-app/package.json b/bench/minimal-server/benchmark-app/package.json
new file mode 100644
index 0000000000000..883a323075faf
--- /dev/null
+++ b/bench/minimal-server/benchmark-app/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "stats-app",
+ "private": true,
+ "license": "MIT",
+ "dependencies": {
+ "webpack-bundle-analyzer": "^4.6.1",
+ "webpack-stats-plugin": "^1.1.0"
+ },
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start"
+ }
+}
diff --git a/bench/minimal-server/benchmark-app/pages/index.js b/bench/minimal-server/benchmark-app/pages/index.js
new file mode 100644
index 0000000000000..a41e3b2fd91bf
--- /dev/null
+++ b/bench/minimal-server/benchmark-app/pages/index.js
@@ -0,0 +1,9 @@
+import * as React from 'react'
+
+export default function page() {
+ return hello world
+}
+
+export async function getServerSideProps() {
+ return {}
+}
diff --git a/bench/minimal-server/package.json b/bench/minimal-server/package.json
new file mode 100644
index 0000000000000..cdb7cecb8f611
--- /dev/null
+++ b/bench/minimal-server/package.json
@@ -0,0 +1,7 @@
+{
+ "name": "next-minimal-server",
+ "description": "Minimal server for Next.js for benchmarking/perf analysis purposes.",
+ "scripts": {
+ "start": "node start.js"
+ }
+}
diff --git a/bench/minimal-server/start.js b/bench/minimal-server/start.js
new file mode 100644
index 0000000000000..ceee4f2e235a9
--- /dev/null
+++ b/bench/minimal-server/start.js
@@ -0,0 +1,40 @@
+process.env.__NEXT_REACT_CHANNEL = 'exp'
+process.env.NODE_ENV = 'production'
+
+require('../../test/lib/react-channel-require-hook')
+
+console.time('next-cold-start')
+const NextServer = require('next/dist/server/next-server').default
+const path = require('path')
+
+const appDir = path.join(__dirname, 'benchmark-app')
+const distDir = '.next'
+
+const compiledConfig = require(path.join(
+ appDir,
+ distDir,
+ 'required-server-files.json'
+)).config
+
+process.chdir(appDir)
+
+const nextServer = new NextServer({
+ conf: compiledConfig,
+ dir: appDir,
+ distDir,
+ minimalMode: true,
+ customServer: false,
+})
+
+const requestHandler = nextServer.getRequestHandler()
+
+require('http')
+ .createServer((req, res) => {
+ console.time('next-request')
+ return requestHandler(req, res).finally(() => {
+ console.timeEnd('next-request')
+ })
+ })
+ .listen(3000, () => {
+ console.timeEnd('next-cold-start')
+ })