From eb8c1628c09f53b347fe8db1e7836ab4891f7bab Mon Sep 17 00:00:00 2001 From: Gregor MacLennan Date: Tue, 19 Aug 2025 12:15:18 +0100 Subject: [PATCH 01/12] feat: create benchmark test app --- .gitignore | 1 + benchmark/.gitattributes | 1 + benchmark/.gitignore | 42 + benchmark/App.js | 81 + benchmark/app.json | 14 + benchmark/index.js | 8 + benchmark/metro.config.js | 35 + .../nodejs-assets/nodejs-project/main.js | 9 + .../nodejs-project/sample-main.js | 12 + .../nodejs-project/sample-package.json | 12 + benchmark/package-lock.json | 9791 +++++++++++++++++ benchmark/package.json | 27 + benchmark/react-native.config.js | 10 + benchmark/tsconfig.json | 10 + package-lock.json | 5271 +++++++++ scripts/download-binaries.sh | 70 + 16 files changed, 15394 insertions(+) create mode 100644 benchmark/.gitattributes create mode 100644 benchmark/.gitignore create mode 100644 benchmark/App.js create mode 100644 benchmark/app.json create mode 100644 benchmark/index.js create mode 100644 benchmark/metro.config.js create mode 100644 benchmark/nodejs-assets/nodejs-project/main.js create mode 100644 benchmark/nodejs-assets/nodejs-project/sample-main.js create mode 100644 benchmark/nodejs-assets/nodejs-project/sample-package.json create mode 100644 benchmark/package-lock.json create mode 100644 benchmark/package.json create mode 100644 benchmark/react-native.config.js create mode 100644 benchmark/tsconfig.json create mode 100644 package-lock.json create mode 100755 scripts/download-binaries.sh diff --git a/.gitignore b/.gitignore index 24a94c7..6fe08be 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,7 @@ build/ .gradle local.properties *.iml +android/.cxx # BUCK buck-out/ diff --git a/benchmark/.gitattributes b/benchmark/.gitattributes new file mode 100644 index 0000000..d42ff18 --- /dev/null +++ b/benchmark/.gitattributes @@ -0,0 +1 @@ +*.pbxproj -text diff --git a/benchmark/.gitignore b/benchmark/.gitignore new file mode 100644 index 0000000..95bde9c --- /dev/null +++ b/benchmark/.gitignore @@ -0,0 +1,42 @@ +# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files + +# dependencies +node_modules/ + +# Expo +.expo/ +dist/ +web-build/ +expo-env.d.ts + +# Native +*.orig.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision + +# Metro +.metro-health-check* + +# debug +npm-debug.* +yarn-debug.* +yarn-error.* + +# macOS +.DS_Store +*.pem + +# local env files +.env*.local + +# typescript +*.tsbuildinfo + +# native folders are created via expo prebuild +android/ +ios/ + +nodejs-assets/build-native-modules-MacOS-helper-script* diff --git a/benchmark/App.js b/benchmark/App.js new file mode 100644 index 0000000..09749fb --- /dev/null +++ b/benchmark/App.js @@ -0,0 +1,81 @@ +import { StatusBar } from "expo-status-bar"; +import React from "react"; +import { StyleSheet, Text, View, Button } from "react-native"; +import nodejs from "nodejs-mobile-react-native"; +import { faker } from "@faker-js/faker"; + +const MSG_COUNT = 1000; +faker.seed("nodejs-mobile-test-messages"); +const MESSAGE_FIXTURES = Array.from({ length: MSG_COUNT }, createRandomUser); + +export default function App() { + const [output, setOutput] = React.useState(""); + const timerRef = React.useRef(0); + + React.useEffect(() => { + nodejs.start("main.js"); + if (!timerRef.current) { + timerRef.current = Date.now(); + } + const subscription = nodejs.channel.addListener( + "message", + (msg) => { + if (msg === "initialized") { + const elapsed = Date.now() - timerRef.current; + timerRef.current = Date.now(); + setOutput(`Node.js initialized in ${elapsed} ms`); + } else if (msg.id === MSG_COUNT) { + setOutput( + (prev) => + `${prev}\nReceived ${msg.id} messages in ${ + Date.now() - timerRef.current + } ms` + ); + } + }, + this + ); + for (const msg of MESSAGE_FIXTURES) { + nodejs.channel.send(msg); + } + return () => { + subscription.remove(); + timerRef.current = 0; + setOutput(""); + }; + }, []); + + return ( + + {output} +