mirror of
https://github.com/streetwriters/notesnook.git
synced 2025-12-23 15:09:33 +01:00
web: add benchmarks
This commit is contained in:
committed by
Abdullah Atta
parent
a011857286
commit
2f4590fbb6
134
apps/web/__bench__/app.bench.mjs
Normal file
134
apps/web/__bench__/app.bench.mjs
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
/*
|
||||||
|
This file is part of the Notesnook project (https://notesnook.com/)
|
||||||
|
|
||||||
|
Copyright (C) 2023 Streetwriters (Private) Limited
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { chromium } from "playwright";
|
||||||
|
import { Bench } from "tinybench";
|
||||||
|
import { withCodSpeed } from "@codspeed/tinybench-plugin";
|
||||||
|
import { spawn } from "child_process";
|
||||||
|
|
||||||
|
const TESTS = [
|
||||||
|
{
|
||||||
|
name: "root import",
|
||||||
|
start: "import:root",
|
||||||
|
end: "start:app"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "app startup",
|
||||||
|
start: "start:app",
|
||||||
|
end: "render:app"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "database load",
|
||||||
|
start: "load:database",
|
||||||
|
end: "render:app"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "signup page load",
|
||||||
|
start: "start:app",
|
||||||
|
end: "load:auth",
|
||||||
|
route: "/signup"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
async function startServer() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const server = spawn("npx", ["serve", "-s", "build"]);
|
||||||
|
|
||||||
|
server.stdout.on("data", (data) => {
|
||||||
|
if (data.toString().includes("Accepting connections")) {
|
||||||
|
console.log(data.toString());
|
||||||
|
resolve(server);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
server.stderr.on("data", (data) => {
|
||||||
|
reject(data.toString());
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on("error", (error) => {
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
await startServer();
|
||||||
|
|
||||||
|
const browser = await chromium.launch();
|
||||||
|
|
||||||
|
for (const testCase of TESTS) {
|
||||||
|
/**
|
||||||
|
* @type {import("playwright").BrowserContext}
|
||||||
|
*/
|
||||||
|
let context;
|
||||||
|
/**
|
||||||
|
* @type {import("playwright").Page}
|
||||||
|
*/
|
||||||
|
let page;
|
||||||
|
|
||||||
|
const bench = withCodSpeed(
|
||||||
|
new Bench({
|
||||||
|
async setup() {
|
||||||
|
context = await browser.newContext({
|
||||||
|
baseURL: "http://localhost:3000"
|
||||||
|
});
|
||||||
|
await context.addInitScript({
|
||||||
|
content: `window.localStorage.setItem("skipInitiation", "true");
|
||||||
|
|
||||||
|
const observer = new PerformanceObserver((list, observer) => {
|
||||||
|
list.getEntries().forEach((entry) => {
|
||||||
|
if (entry.entryType === "mark" && entry.name === "${testCase.end}") {
|
||||||
|
observer.disconnect();
|
||||||
|
console.log(
|
||||||
|
"ended: ${testCase.name}",
|
||||||
|
performance.measure(
|
||||||
|
"${testCase.end}",
|
||||||
|
"${testCase.start}",
|
||||||
|
"${testCase.end}"
|
||||||
|
).duration
|
||||||
|
);
|
||||||
|
window.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
observer.observe({ entryTypes: ["mark"] });`
|
||||||
|
});
|
||||||
|
page = await context.newPage();
|
||||||
|
},
|
||||||
|
async teardown() {
|
||||||
|
await context.close();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
bench.add(testCase.name, async () => {
|
||||||
|
await page.goto(testCase.route || "/");
|
||||||
|
await page.waitForEvent("console", {
|
||||||
|
predicate(consoleMessage) {
|
||||||
|
return consoleMessage.text().startsWith(`ended: ${testCase.name}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
await bench.warmup();
|
||||||
|
await bench.run();
|
||||||
|
|
||||||
|
console.table(bench.table());
|
||||||
|
}
|
||||||
|
|
||||||
|
await browser.close();
|
||||||
127
apps/web/package-lock.json
generated
127
apps/web/package-lock.json
generated
@@ -88,6 +88,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.22.5",
|
"@babel/core": "^7.22.5",
|
||||||
|
"@codspeed/tinybench-plugin": "^3.1.1",
|
||||||
"@playwright/test": "^1.43.1",
|
"@playwright/test": "^1.43.1",
|
||||||
"@swc/core": "^1.5.24",
|
"@swc/core": "^1.5.24",
|
||||||
"@swc/plugin-react-remove-properties": "^2.0.4",
|
"@swc/plugin-react-remove-properties": "^2.0.4",
|
||||||
@@ -31023,7 +31024,9 @@
|
|||||||
"@lingui/swc-plugin": "^4.0.10",
|
"@lingui/swc-plugin": "^4.0.10",
|
||||||
"@types/react": "^18.2.39",
|
"@types/react": "^18.2.39",
|
||||||
"babel-plugin-macros": "^3.1.0",
|
"babel-plugin-macros": "^3.1.0",
|
||||||
|
"nodemon": "^3.1.7",
|
||||||
"react": "18.2.0",
|
"react": "18.2.0",
|
||||||
|
"rollup": "^4.24.4",
|
||||||
"typescript": "5.5.3",
|
"typescript": "5.5.3",
|
||||||
"vite": "^5.4.8",
|
"vite": "^5.4.8",
|
||||||
"vite-plugin-dts": "^4.2.3",
|
"vite-plugin-dts": "^4.2.3",
|
||||||
@@ -40525,6 +40528,33 @@
|
|||||||
"pnpm": ">=5"
|
"pnpm": ">=5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@codspeed/core": {
|
||||||
|
"version": "3.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@codspeed/core/-/core-3.1.1.tgz",
|
||||||
|
"integrity": "sha512-ONhERVDAtkm0nc+FYPivDozoMOlNUP2BWRBFDJYATGA18Iap5Kd2mZ1/Lwz54RB5+g+3YDOpsvotHa4hd3Q+7Q==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"axios": "^1.4.0",
|
||||||
|
"find-up": "^6.3.0",
|
||||||
|
"form-data": "^4.0.0",
|
||||||
|
"node-gyp-build": "^4.6.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@codspeed/tinybench-plugin": {
|
||||||
|
"version": "3.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@codspeed/tinybench-plugin/-/tinybench-plugin-3.1.1.tgz",
|
||||||
|
"integrity": "sha512-LVF4End0kDU9V7CzuwAcmngSPJNnpduPnr+csOKvcG++FsYwfUuBJ1rvLPtv6yTkvxpUmUEsj6VA7/AEIBGZVw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@codspeed/core": "^3.1.1",
|
||||||
|
"stack-trace": "1.0.0-pre2"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"tinybench": "^2.3.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@dnd-kit/accessibility": {
|
"node_modules/@dnd-kit/accessibility": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -44735,6 +44765,23 @@
|
|||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/find-up": {
|
||||||
|
"version": "6.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
|
||||||
|
"integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"locate-path": "^7.1.0",
|
||||||
|
"path-exists": "^5.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/follow-redirects": {
|
"node_modules/follow-redirects": {
|
||||||
"version": "1.15.3",
|
"version": "1.15.3",
|
||||||
"funding": [
|
"funding": [
|
||||||
@@ -46210,6 +46257,22 @@
|
|||||||
"url": "https://github.com/sponsors/antfu"
|
"url": "https://github.com/sponsors/antfu"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/locate-path": {
|
||||||
|
"version": "7.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
|
||||||
|
"integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"p-locate": "^6.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/lodash": {
|
"node_modules/lodash": {
|
||||||
"version": "4.17.21",
|
"version": "4.17.21",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
@@ -47438,6 +47501,18 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/node-gyp-build": {
|
||||||
|
"version": "4.8.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.3.tgz",
|
||||||
|
"integrity": "sha512-EMS95CMJzdoSKoIiXo8pxKoL8DYxwIZXYlLmgPb8KUv794abpnLK6ynsCAWNliOjREKruYKdzbh76HHYUHX7nw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"bin": {
|
||||||
|
"node-gyp-build": "bin.js",
|
||||||
|
"node-gyp-build-optional": "optional.js",
|
||||||
|
"node-gyp-build-test": "build-test.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/node-releases": {
|
"node_modules/node-releases": {
|
||||||
"version": "2.0.18",
|
"version": "2.0.18",
|
||||||
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
|
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
|
||||||
@@ -47637,6 +47712,38 @@
|
|||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/p-locate": {
|
||||||
|
"version": "6.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
|
||||||
|
"integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"p-limit": "^4.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/p-locate/node_modules/p-limit": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"yocto-queue": "^1.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/parent-module": {
|
"node_modules/parent-module": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -47667,6 +47774,16 @@
|
|||||||
"version": "6.0.1",
|
"version": "6.0.1",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/path-exists": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/path-is-absolute": {
|
"node_modules/path-is-absolute": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"devOptional": true,
|
"devOptional": true,
|
||||||
@@ -48964,6 +49081,16 @@
|
|||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"license": "BSD-3-Clause"
|
"license": "BSD-3-Clause"
|
||||||
},
|
},
|
||||||
|
"node_modules/stack-trace": {
|
||||||
|
"version": "1.0.0-pre2",
|
||||||
|
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz",
|
||||||
|
"integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=16"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/stackback": {
|
"node_modules/stackback": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.2",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
|||||||
@@ -86,6 +86,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.22.5",
|
"@babel/core": "^7.22.5",
|
||||||
|
"@codspeed/tinybench-plugin": "^3.1.1",
|
||||||
"@playwright/test": "^1.43.1",
|
"@playwright/test": "^1.43.1",
|
||||||
"@swc/core": "^1.5.24",
|
"@swc/core": "^1.5.24",
|
||||||
"@swc/plugin-react-remove-properties": "^2.0.4",
|
"@swc/plugin-react-remove-properties": "^2.0.4",
|
||||||
|
|||||||
@@ -53,7 +53,9 @@ locale.then(({ default: locale }) => {
|
|||||||
});
|
});
|
||||||
i18n.activate("en");
|
i18n.activate("en");
|
||||||
|
|
||||||
|
performance.mark("import:root");
|
||||||
import("./root").then(({ startApp }) => {
|
import("./root").then(({ startApp }) => {
|
||||||
|
performance.mark("start:app");
|
||||||
startApp();
|
startApp();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ export async function startApp() {
|
|||||||
|
|
||||||
await useKeyStore.getState().init();
|
await useKeyStore.getState().init();
|
||||||
|
|
||||||
|
performance.mark("load:database");
|
||||||
loadDatabase(
|
loadDatabase(
|
||||||
path !== "/sessionexpired" || Config.get("sessionExpired", false)
|
path !== "/sessionexpired" || Config.get("sessionExpired", false)
|
||||||
? "db"
|
? "db"
|
||||||
@@ -145,6 +146,7 @@ function RouteWrapper(props: {
|
|||||||
</Text>
|
</Text>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
performance.mark("render:app");
|
||||||
return <Component route={routeProps?.route || "login:email"} />;
|
return <Component route={routeProps?.route || "login:email"} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -198,6 +198,7 @@ export function HeadlessAuth(props: AuthProps) {
|
|||||||
db.user.getUser().then((user) => {
|
db.user.getUser().then((user) => {
|
||||||
if (user && authorizedRoutes.includes(route) && !isSessionExpired())
|
if (user && authorizedRoutes.includes(route) && !isSessionExpired())
|
||||||
return openURL("/", { authenticated: true });
|
return openURL("/", { authenticated: true });
|
||||||
|
performance.mark("load:auth");
|
||||||
setIsReady(true);
|
setIsReady(true);
|
||||||
});
|
});
|
||||||
}, [route, openURL]);
|
}, [route, openURL]);
|
||||||
|
|||||||
Reference in New Issue
Block a user