From 1c6a0d0aa88b07ea239d5e8648528e70edd0f128 Mon Sep 17 00:00:00 2001 From: AdamWasielewski Date: Wed, 3 Sep 2025 09:27:41 +0200 Subject: [PATCH 1/3] init --- inProgress/js-python-benchmark/NodeJS/app.js | 68 ++ .../NodeJS/package-lock.json | 918 ++++++++++++++++++ .../js-python-benchmark/NodeJS/package.json | 7 + .../Python/calledclass/Dockerfile | 21 + .../Python/calledclass/MyClass.py | 5 + .../Python/fastapi/Dockerfile | 10 + .../Python/fastapi/main.py | 8 + .../Python/fastapi/requirements.txt | 2 + .../Python/flask/Dockerfile | 9 + .../js-python-benchmark/Python/flask/app.py | 11 + .../Python/flask/requirements.txt | 1 + inProgress/js-python-benchmark/Readme.md | 25 + 12 files changed, 1085 insertions(+) create mode 100644 inProgress/js-python-benchmark/NodeJS/app.js create mode 100644 inProgress/js-python-benchmark/NodeJS/package-lock.json create mode 100644 inProgress/js-python-benchmark/NodeJS/package.json create mode 100644 inProgress/js-python-benchmark/Python/calledclass/Dockerfile create mode 100644 inProgress/js-python-benchmark/Python/calledclass/MyClass.py create mode 100644 inProgress/js-python-benchmark/Python/fastapi/Dockerfile create mode 100644 inProgress/js-python-benchmark/Python/fastapi/main.py create mode 100644 inProgress/js-python-benchmark/Python/fastapi/requirements.txt create mode 100644 inProgress/js-python-benchmark/Python/flask/Dockerfile create mode 100644 inProgress/js-python-benchmark/Python/flask/app.py create mode 100644 inProgress/js-python-benchmark/Python/flask/requirements.txt create mode 100644 inProgress/js-python-benchmark/Readme.md diff --git a/inProgress/js-python-benchmark/NodeJS/app.js b/inProgress/js-python-benchmark/NodeJS/app.js new file mode 100644 index 0000000..0298360 --- /dev/null +++ b/inProgress/js-python-benchmark/NodeJS/app.js @@ -0,0 +1,68 @@ +const axios = require("axios"); +const {Javonet, WsConnectionData} = require('javonet-nodejs-sdk') + +const iterations = 100; + +async function run() { + const url = "http://localhost:8086/getstring"; // your api URL + const times = []; + + for (let i = 0; i < iterations; i++) { + const start = Date.now(); + try { + await axios.get(url); + } catch (err) { + console.error(`Request ${i + 1} failed:`, err.message); + continue; + } + const elapsed = Date.now() - start; + times.push(elapsed); + } + + if (times.length > 0) { + const avg = times.reduce((a, b) => a + b, 0) / times.length; + console.log(`\nHTTP Average: ${avg.toFixed(3)} ms`); + } else { + console.log("No successful requests to calculate average."); + } +} + +async function pythonCall() { + Javonet.activate("your-API-key") + + const ws = "ws://127.0.0.1:8090/ws"; + const times = []; + + try { + const pythonRuntime = Javonet.webSocket(new WsConnectionData(ws)).python(); + const pyType = await pythonRuntime.getType("MyClass.MyClass"); + const pyInstance = await pyType.createInstance(); + + for (let i = 0; i < iterations; i++) { + const start = Date.now(); + try { + const result = await pyInstance + .invokeInstanceMethod("getstring") + .execute(); + const elapsed = Date.now() - start; + const value = await result.getValue(); + + times.push(elapsed); + } catch (err) { + console.error(`Request ${i + 1} failed:`, err.message); + } + } + + if (times.length > 0) { + const avg = times.reduce((a, b) => a + b, 0) / times.length; + console.log(`\nJavonet Average: ${avg.toFixed(3)} ms`); + } else { + console.log("No successful requests to calculate average."); + } + } catch (err) { + console.error("Initialization failed:", err); + } +} + +run(); +pythonCall(); diff --git a/inProgress/js-python-benchmark/NodeJS/package-lock.json b/inProgress/js-python-benchmark/NodeJS/package-lock.json new file mode 100644 index 0000000..b344962 --- /dev/null +++ b/inProgress/js-python-benchmark/NodeJS/package-lock.json @@ -0,0 +1,918 @@ +{ + "name": "NodeJS", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "axios": "^1.11.0", + "javonet-nodejs-sdk": "^2.6.2", + "ws": "^8.18.3" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@types/node": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.10.0" + } + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", + "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/javonet-nodejs-sdk": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/javonet-nodejs-sdk/-/javonet-nodejs-sdk-2.6.2.tgz", + "integrity": "sha512-7D61AY9svM3TNqMVOvh3wC/nwkP9DLsRUuoRwZ/PcX7QX/nAwfpzf/gHgW50doGDC71tPhR/lUfhtvc2Hf84Mg==", + "license": "ISC", + "dependencies": { + "@types/ws": "^8.18.1", + "buffer": "^6.0.3", + "glob": "^10.4.5", + "uuid": "^10.0.0" + }, + "peerDependencies": { + "crypto": "^1.0.1", + "dns": "^0.2.2", + "ws": "^8.0.0" + }, + "peerDependenciesMeta": { + "crypto": { + "optional": true + }, + "dns": { + "optional": true + }, + "fs-extra": { + "optional": true + }, + "ws": { + "optional": true + } + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/undici-types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/inProgress/js-python-benchmark/NodeJS/package.json b/inProgress/js-python-benchmark/NodeJS/package.json new file mode 100644 index 0000000..4e0f901 --- /dev/null +++ b/inProgress/js-python-benchmark/NodeJS/package.json @@ -0,0 +1,7 @@ +{ + "dependencies": { + "axios": "^1.11.0", + "javonet-nodejs-sdk": "^2.6.2", + "ws": "^8.18.3" + } +} diff --git a/inProgress/js-python-benchmark/Python/calledclass/Dockerfile b/inProgress/js-python-benchmark/Python/calledclass/Dockerfile new file mode 100644 index 0000000..352f482 --- /dev/null +++ b/inProgress/js-python-benchmark/Python/calledclass/Dockerfile @@ -0,0 +1,21 @@ +FROM ubuntu:24.04 + +USER root + +# instalacja Pythona 3.12 (jest w repo 24.04) + dependencies dla gg +RUN apt-get update && apt-get install -y --no-install-recommends \ + python3 python3-venv python3-pip \ + libxml2-dev openssl libxmlsec1-dev libxmlsec1-openssl libjsoncpp25 libpython3-dev \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +WORKDIR /usr/local/app + +ENV LD_LIBRARY_PATH=/usr/local/app + +# kopiujemy binarkÄ™ gg +COPY gg ./gg +COPY MyClass.py ./ + +EXPOSE 8090 + +CMD ["./gg", "--licenseKey", "your-API-key", "--runtime", "python", "--modules", "./MyClass.py"] \ No newline at end of file diff --git a/inProgress/js-python-benchmark/Python/calledclass/MyClass.py b/inProgress/js-python-benchmark/Python/calledclass/MyClass.py new file mode 100644 index 0000000..3f6b658 --- /dev/null +++ b/inProgress/js-python-benchmark/Python/calledclass/MyClass.py @@ -0,0 +1,5 @@ +class MyClass: + __type__ = "MyClass" + + def getstring(self) -> str: + return "Tested!" \ No newline at end of file diff --git a/inProgress/js-python-benchmark/Python/fastapi/Dockerfile b/inProgress/js-python-benchmark/Python/fastapi/Dockerfile new file mode 100644 index 0000000..91f71de --- /dev/null +++ b/inProgress/js-python-benchmark/Python/fastapi/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3.12-slim + +WORKDIR /app +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY main.py . +EXPOSE 8000 +# Kluczowe: host 0.0.0.0 i port 8000 (zgodny z mapowaniem 8088:8000) +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/inProgress/js-python-benchmark/Python/fastapi/main.py b/inProgress/js-python-benchmark/Python/fastapi/main.py new file mode 100644 index 0000000..f5f9948 --- /dev/null +++ b/inProgress/js-python-benchmark/Python/fastapi/main.py @@ -0,0 +1,8 @@ +from fastapi import FastAPI +from fastapi.responses import PlainTextResponse + +app = FastAPI() + +@app.get("/getstring", response_class=PlainTextResponse) +def getstring(): + return "Tested!" diff --git a/inProgress/js-python-benchmark/Python/fastapi/requirements.txt b/inProgress/js-python-benchmark/Python/fastapi/requirements.txt new file mode 100644 index 0000000..97dc7cd --- /dev/null +++ b/inProgress/js-python-benchmark/Python/fastapi/requirements.txt @@ -0,0 +1,2 @@ +fastapi +uvicorn diff --git a/inProgress/js-python-benchmark/Python/flask/Dockerfile b/inProgress/js-python-benchmark/Python/flask/Dockerfile new file mode 100644 index 0000000..233e8d2 --- /dev/null +++ b/inProgress/js-python-benchmark/Python/flask/Dockerfile @@ -0,0 +1,9 @@ +FROM python:3.12-slim + +WORKDIR /app +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY app.py . +EXPOSE 5000 +CMD ["python", "app.py"] diff --git a/inProgress/js-python-benchmark/Python/flask/app.py b/inProgress/js-python-benchmark/Python/flask/app.py new file mode 100644 index 0000000..9c736ae --- /dev/null +++ b/inProgress/js-python-benchmark/Python/flask/app.py @@ -0,0 +1,11 @@ +from flask import Flask, Response + +app = Flask(__name__) + +@app.get("/getstring") +def getstring(): + return Response("Tested!", mimetype="text/plain") + +if __name__ == "__main__": + # 0.0.0.0 potrzebne w kontenerze + app.run(host="0.0.0.0", port=5000) diff --git a/inProgress/js-python-benchmark/Python/flask/requirements.txt b/inProgress/js-python-benchmark/Python/flask/requirements.txt new file mode 100644 index 0000000..e3e9a71 --- /dev/null +++ b/inProgress/js-python-benchmark/Python/flask/requirements.txt @@ -0,0 +1 @@ +Flask diff --git a/inProgress/js-python-benchmark/Readme.md b/inProgress/js-python-benchmark/Readme.md new file mode 100644 index 0000000..142c87c --- /dev/null +++ b/inProgress/js-python-benchmark/Readme.md @@ -0,0 +1,25 @@ +FastApi +100 calls (ms): +Javonet Average: 2.420 +HTTP Average: 2.690 + +1000 calls (ms): +Javonet Average: 1.968 +HTTP Average: 2.113 + +10000 calls (ms): +Javonet Average: 2.157 +HTTP Average: 2.329 + +Flask +100 calls (ms): +Javonet Average: 4.220 +HTTP Average: 8.090 + +1000 calls (ms): +Javonet Average: 2.543 +HTTP Average: 8.691 + +10000 calls (ms): +Javonet Average: 3.095 +HTTP Average: 8.468 \ No newline at end of file From 752143d8f49ffbeb58c909777334ae2bd4eef8d7 Mon Sep 17 00:00:00 2001 From: AdamWasielewski Date: Wed, 3 Sep 2025 09:49:02 +0200 Subject: [PATCH 2/3] comments removed --- inProgress/js-python-benchmark/Python/calledclass/Dockerfile | 2 -- inProgress/js-python-benchmark/Python/fastapi/Dockerfile | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/inProgress/js-python-benchmark/Python/calledclass/Dockerfile b/inProgress/js-python-benchmark/Python/calledclass/Dockerfile index 352f482..12cbbd2 100644 --- a/inProgress/js-python-benchmark/Python/calledclass/Dockerfile +++ b/inProgress/js-python-benchmark/Python/calledclass/Dockerfile @@ -2,7 +2,6 @@ FROM ubuntu:24.04 USER root -# instalacja Pythona 3.12 (jest w repo 24.04) + dependencies dla gg RUN apt-get update && apt-get install -y --no-install-recommends \ python3 python3-venv python3-pip \ libxml2-dev openssl libxmlsec1-dev libxmlsec1-openssl libjsoncpp25 libpython3-dev \ @@ -12,7 +11,6 @@ WORKDIR /usr/local/app ENV LD_LIBRARY_PATH=/usr/local/app -# kopiujemy binarkÄ™ gg COPY gg ./gg COPY MyClass.py ./ diff --git a/inProgress/js-python-benchmark/Python/fastapi/Dockerfile b/inProgress/js-python-benchmark/Python/fastapi/Dockerfile index 91f71de..d361d80 100644 --- a/inProgress/js-python-benchmark/Python/fastapi/Dockerfile +++ b/inProgress/js-python-benchmark/Python/fastapi/Dockerfile @@ -6,5 +6,5 @@ RUN pip install --no-cache-dir -r requirements.txt COPY main.py . EXPOSE 8000 -# Kluczowe: host 0.0.0.0 i port 8000 (zgodny z mapowaniem 8088:8000) + CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] From 02b44c1e1c9462576b137f8d8f0bc49810616573 Mon Sep 17 00:00:00 2001 From: AdamWasielewski Date: Wed, 3 Sep 2025 12:13:47 +0200 Subject: [PATCH 3/3] to review --- .../NodeJS/app.js | 0 .../NodeJS/package-lock.json | 0 .../NodeJS/package.json | 0 .../Python/calledclass/Dockerfile | 0 .../Python/calledclass/MyClass.py | 0 .../Python/fastapi/Dockerfile | 0 .../Python/fastapi/main.py | 0 .../Python/fastapi/requirements.txt | 0 .../Python/flask/Dockerfile | 0 .../Python/flask/app.py | 0 .../Python/flask/requirements.txt | 0 .../Readme.md | 225 ++++++++++++++++++ 12 files changed, 225 insertions(+) rename inProgress/{js-python-benchmark => javonet-vs-rest-the-fastest-path-from-javascript-to-python}/NodeJS/app.js (100%) rename inProgress/{js-python-benchmark => javonet-vs-rest-the-fastest-path-from-javascript-to-python}/NodeJS/package-lock.json (100%) rename inProgress/{js-python-benchmark => javonet-vs-rest-the-fastest-path-from-javascript-to-python}/NodeJS/package.json (100%) rename inProgress/{js-python-benchmark => javonet-vs-rest-the-fastest-path-from-javascript-to-python}/Python/calledclass/Dockerfile (100%) rename inProgress/{js-python-benchmark => javonet-vs-rest-the-fastest-path-from-javascript-to-python}/Python/calledclass/MyClass.py (100%) rename inProgress/{js-python-benchmark => javonet-vs-rest-the-fastest-path-from-javascript-to-python}/Python/fastapi/Dockerfile (100%) rename inProgress/{js-python-benchmark => javonet-vs-rest-the-fastest-path-from-javascript-to-python}/Python/fastapi/main.py (100%) rename inProgress/{js-python-benchmark => javonet-vs-rest-the-fastest-path-from-javascript-to-python}/Python/fastapi/requirements.txt (100%) rename inProgress/{js-python-benchmark => javonet-vs-rest-the-fastest-path-from-javascript-to-python}/Python/flask/Dockerfile (100%) rename inProgress/{js-python-benchmark => javonet-vs-rest-the-fastest-path-from-javascript-to-python}/Python/flask/app.py (100%) rename inProgress/{js-python-benchmark => javonet-vs-rest-the-fastest-path-from-javascript-to-python}/Python/flask/requirements.txt (100%) create mode 100644 inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Readme.md diff --git a/inProgress/js-python-benchmark/NodeJS/app.js b/inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/NodeJS/app.js similarity index 100% rename from inProgress/js-python-benchmark/NodeJS/app.js rename to inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/NodeJS/app.js diff --git a/inProgress/js-python-benchmark/NodeJS/package-lock.json b/inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/NodeJS/package-lock.json similarity index 100% rename from inProgress/js-python-benchmark/NodeJS/package-lock.json rename to inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/NodeJS/package-lock.json diff --git a/inProgress/js-python-benchmark/NodeJS/package.json b/inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/NodeJS/package.json similarity index 100% rename from inProgress/js-python-benchmark/NodeJS/package.json rename to inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/NodeJS/package.json diff --git a/inProgress/js-python-benchmark/Python/calledclass/Dockerfile b/inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Python/calledclass/Dockerfile similarity index 100% rename from inProgress/js-python-benchmark/Python/calledclass/Dockerfile rename to inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Python/calledclass/Dockerfile diff --git a/inProgress/js-python-benchmark/Python/calledclass/MyClass.py b/inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Python/calledclass/MyClass.py similarity index 100% rename from inProgress/js-python-benchmark/Python/calledclass/MyClass.py rename to inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Python/calledclass/MyClass.py diff --git a/inProgress/js-python-benchmark/Python/fastapi/Dockerfile b/inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Python/fastapi/Dockerfile similarity index 100% rename from inProgress/js-python-benchmark/Python/fastapi/Dockerfile rename to inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Python/fastapi/Dockerfile diff --git a/inProgress/js-python-benchmark/Python/fastapi/main.py b/inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Python/fastapi/main.py similarity index 100% rename from inProgress/js-python-benchmark/Python/fastapi/main.py rename to inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Python/fastapi/main.py diff --git a/inProgress/js-python-benchmark/Python/fastapi/requirements.txt b/inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Python/fastapi/requirements.txt similarity index 100% rename from inProgress/js-python-benchmark/Python/fastapi/requirements.txt rename to inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Python/fastapi/requirements.txt diff --git a/inProgress/js-python-benchmark/Python/flask/Dockerfile b/inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Python/flask/Dockerfile similarity index 100% rename from inProgress/js-python-benchmark/Python/flask/Dockerfile rename to inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Python/flask/Dockerfile diff --git a/inProgress/js-python-benchmark/Python/flask/app.py b/inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Python/flask/app.py similarity index 100% rename from inProgress/js-python-benchmark/Python/flask/app.py rename to inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Python/flask/app.py diff --git a/inProgress/js-python-benchmark/Python/flask/requirements.txt b/inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Python/flask/requirements.txt similarity index 100% rename from inProgress/js-python-benchmark/Python/flask/requirements.txt rename to inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Python/flask/requirements.txt diff --git a/inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Readme.md b/inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Readme.md new file mode 100644 index 0000000..40c05d2 --- /dev/null +++ b/inProgress/javonet-vs-rest-the-fastest-path-from-javascript-to-python/Readme.md @@ -0,0 +1,225 @@ +# Javonet vs REST: The Fastest Path from JavaScript to Python + +## Introduction +In modern software development, seamless interoperability between different programming languages is often a key requirement. Teams frequently face the challenge of connecting applications written in JavaScript with backend logic implemented in Python. The most common approach is to expose Python functionality over REST APIs, which provides flexibility but also introduces serialization overhead, network latency, and infrastructure complexity. + +In this article, we present a benchmark comparison of Javonet vs REST for JavaScript-to-Python calls. Our goal is to evaluate performance differences, identify potential bottlenecks, and provide practical insights into when each approach may be the best fit. + +[toc] + +## Test Environment +OS: **Windows 11** +CPU/RAM: **Intel Core i7-1355U**/**32GB** +Docker: **28.3.3** +Node.js: **22.19** +Python: **3.12** + +## Flask code + +A simple Flask application that exposes endpoint `getstring`: +```python= +from flask import Flask, Response + +app = Flask(__name__) + +@app.get("/getstring") +def getstring(): + return Response("Tested!", mimetype="text/plain") + +if __name__ == "__main__": + # 0.0.0.0 potrzebne w kontenerze + app.run(host="0.0.0.0", port=5000) +``` + +We create a Dockerfile based on a slim Python image, copy the application and requirements, install dependencies, and run the app: + +```dockerfile= +FROM python:3.12-slim + +WORKDIR /app +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY app.py . +EXPOSE 5000 + +CMD ["python", "app.py"] +``` + +Let's build docker image and start container: +```bash! +docker build -t flask . +docker run -p 8080:80 -p 8081:81 flask +``` + +We should create `requirements.txt`: +``` +Flask +``` + +## Fast API + +Same thing we can do with FlaskApi: +```python= +from fastapi import FastAPI +from fastapi.responses import PlainTextResponse + +app = FastAPI() + +@app.get("/getstring", response_class=PlainTextResponse) +def getstring(): + return "Tested!" +``` +Dockerfile: +```dockerfile= +FROM python:3.12-slim + +WORKDIR /app +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY main.py . +EXPOSE 8000 + +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] +``` + +And `requirements.txt`: +``` +fastapi +uvicorn +``` + +## Python code called by Javonet +Now we will create a simple Python application that serves the same function as the previous API, but this time it will be invoked through Javonet code. Let's create `MyClass.py`: +```python= +class MyClass: + __type__ = "MyClass" + + def getstring(self) -> str: + return "Tested!" +``` +We also need to download the `gg` file and place it in the same directory as MyClass.py and the `Dockerfile`. + +Our `Dockerfile` should look like this: +```dockerfile= +FROM ubuntu:24.04 + +USER root + +RUN apt-get update && apt-get install -y --no-install-recommends \ + python3 python3-venv python3-pip \ + libxml2-dev openssl libxmlsec1-dev libxmlsec1-openssl libjsoncpp25 libpython3-dev \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +WORKDIR /usr/local/app + +ENV LD_LIBRARY_PATH=/usr/local/app + +COPY gg ./gg +COPY MyClass.py ./ + +EXPOSE 8090 + +CMD ["./gg", "--licenseKey", "your-API-key", "--runtime", "python", "--modules", "./MyClass.py"] +``` +And we can run it: +```bash! +docker build -t pythonclass . +# Use different ports than before. +docker run -p 8082:80 -p 8083:81 pythonclass +``` + +## Testing code +Now we can move on to creating the JavaScript code that will test the Docker containers we have prepared. +```javascript= +const axios = require("axios"); +const {Javonet, WsConnectionData} = require('javonet-nodejs-sdk') + +const iterations = 100; // set the number of iterations + +async function run() { + const url = "http://localhost:8080/getstring"; // your api URL + const times = []; + + for (let i = 0; i < iterations; i++) { + const start = Date.now(); + try { + await axios.get(url); + } catch (err) { + console.error(`Request ${i + 1} failed:`, err.message); + continue; + } + const elapsed = Date.now() - start; + times.push(elapsed); + } + + if (times.length > 0) { + const avg = times.reduce((a, b) => a + b, 0) / times.length; + console.log(`\nHTTP Average: ${avg.toFixed(3)} ms`); + } else { + console.log("No successful requests to calculate average."); + } +} + +async function pythonCall() { + Javonet.activate("your-API-key"); + + const ws = "ws://127.0.0.1:8082/ws"; + const times = []; + + try { + const pythonRuntime = Javonet.webSocket(new WsConnectionData(ws)).python(); + const pyType = await pythonRuntime.getType("MyClass.MyClass"); + const pyInstance = await pyType.createInstance(); + + for (let i = 0; i < iterations; i++) { + const start = Date.now(); + try { + const result = await pyInstance + .invokeInstanceMethod("getstring") + .execute(); + const elapsed = Date.now() - start; + const value = await result.getValue(); + + times.push(elapsed); + } catch (err) { + console.error(`Request ${i + 1} failed:`, err.message); + } + } + + if (times.length > 0) { + const avg = times.reduce((a, b) => a + b, 0) / times.length; + console.log(`\nJavonet Average: ${avg.toFixed(3)} ms`); + } else { + console.log("No successful requests to calculate average."); + } + } catch (err) { + console.error("Initialization failed:", err); + } +} + +run(); +pythonCall(); + +``` +For sample tests on our hardware, we obtained the following results (ms): +``` +100 calls: +Javonet Average: 2.420 +FastApi Average: 2.690 +Flask Average: 8.090 + +1000 calls: +Javonet Average: 1.968 +FastApi Average: 2.113 +Flask Average: 8.691 + +10000 calls: +Javonet Average: 2.157 +FastApi Average: 2.329 +Flask Average: 8.468 +``` + +## Conclusion +The benchmarks show that Javonet consistently outperforms REST-based approaches when calling Python from JavaScript. Across 100, 1,000, and 10,000 calls, Javonet maintained the lowest average latency (around 2 ms), slightly ahead of FastAPI and far faster than Flask, which stayed above 8 ms. While REST remains valuable for distributed systems, Javonet offers a clear advantage when low latency and maximum performance are required. \ No newline at end of file