From b7f733a6f0cd9e18feaffe0078fb925ce09521d3 Mon Sep 17 00:00:00 2001 From: Roger Qiu Date: Sun, 13 Aug 2023 16:17:24 +1000 Subject: [PATCH 1/2] feat: migrate to ESM --- .eslintrc | 17 ++++++----- README.md | 2 +- benches/index.ts | 29 +++++++++++++------ benches/utils/index.ts | 2 +- benches/utils/utils.ts | 21 ++++++++------ benches/worker_manager.ts | 22 +++++++++------ jest.config.js => jest.config.mjs | 27 ++++++++++-------- package.json | 44 ++++++++++++++++++----------- scripts/test.mjs | 47 +++++++++++++++++++++++++++++++ src/WorkerManager.ts | 6 ++-- src/index.ts | 10 +++---- src/worker.ts | 4 +-- tests/WorkerManager.test.ts | 8 +++--- tests/setup.ts | 3 ++ tsconfig.json | 18 +++++------- 15 files changed, 171 insertions(+), 89 deletions(-) rename jest.config.js => jest.config.mjs (78%) create mode 100644 scripts/test.mjs diff --git a/.eslintrc b/.eslintrc index 786b7e5..9281326 100644 --- a/.eslintrc +++ b/.eslintrc @@ -7,19 +7,18 @@ "jest": true }, "parser": "@typescript-eslint/parser", - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended", - "prettier" - ], - "plugins": [ - "import" - ], "parserOptions": { "project": "tsconfig.json", "sourceType": "module" }, + "plugins": [ + "import" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended" + ], "rules": { "linebreak-style": ["error", "unix"], "no-empty": 1, diff --git a/README.md b/README.md index d73e636..069cd72 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ npm install # build the dist npm run build # run the repl (this allows you to import from ./src) -npm run ts-node +npm run tsx # run the tests npm run test # lint the source code diff --git a/benches/index.ts b/benches/index.ts index 52393c1..5cd9256 100644 --- a/benches/index.ts +++ b/benches/index.ts @@ -1,25 +1,29 @@ #!/usr/bin/env ts-node -import fs from 'fs'; -import path from 'path'; +import fs from 'node:fs'; +import path from 'node:path'; +import url from 'node:url'; import si from 'systeminformation'; -import workerManager from './worker_manager'; +import { benchesPath } from './utils/utils.js'; +import workerManager from './worker_manager.js'; async function main(): Promise { - await fs.promises.mkdir(path.join(__dirname, 'results'), { recursive: true }); + await fs.promises.mkdir(path.join(benchesPath, 'results'), { + recursive: true, + }); await workerManager(); const resultFilenames = await fs.promises.readdir( - path.join(__dirname, 'results'), + path.join(benchesPath, 'results'), ); const metricsFile = await fs.promises.open( - path.join(__dirname, 'results', 'metrics.txt'), + path.join(benchesPath, 'results', 'metrics.txt'), 'w', ); let concatenating = false; for (const resultFilename of resultFilenames) { if (/.+_metrics\.txt$/.test(resultFilename)) { const metricsData = await fs.promises.readFile( - path.join(__dirname, 'results', resultFilename), + path.join(benchesPath, 'results', resultFilename), ); if (concatenating) { await metricsFile.write('\n'); @@ -35,9 +39,16 @@ async function main(): Promise { system: 'model, manufacturer', }); await fs.promises.writeFile( - path.join(__dirname, 'results', 'system.json'), + path.join(benchesPath, 'results', 'system.json'), JSON.stringify(systemData, null, 2), ); } -void main(); +if (import.meta.url.startsWith('file:')) { + const modulePath = url.fileURLToPath(import.meta.url); + if (process.argv[1] === modulePath) { + void main(); + } +} + +export default main; diff --git a/benches/utils/index.ts b/benches/utils/index.ts index 04bca77..9be8099 100644 --- a/benches/utils/index.ts +++ b/benches/utils/index.ts @@ -1 +1 @@ -export * from './utils'; +export * from './utils.js'; diff --git a/benches/utils/utils.ts b/benches/utils/utils.ts index 71c4d10..ce8ec15 100644 --- a/benches/utils/utils.ts +++ b/benches/utils/utils.ts @@ -1,28 +1,33 @@ -import fs from 'fs'; -import path from 'path'; +import fs from 'node:fs'; +import path from 'node:path'; +import url from 'node:url'; import b from 'benny'; import { codeBlock } from 'common-tags'; -import packageJson from '../../package.json'; +import packageJson from '../../package.json' assert { type: 'json' }; + +const benchesPath = path.dirname( + path.dirname(url.fileURLToPath(import.meta.url)), +); const suiteCommon = [ b.cycle(), b.complete(), b.save({ file: (summary) => summary.name, - folder: path.join(__dirname, '../results'), + folder: path.join(benchesPath, 'results'), version: packageJson.version, details: true, }), b.save({ file: (summary) => summary.name, - folder: path.join(__dirname, '../results'), + folder: path.join(benchesPath, 'results'), version: packageJson.version, format: 'chart.html', }), b.complete((summary) => { const filePath = path.join( - __dirname, - '../results', + benchesPath, + 'results', summary.name + '_metrics.txt', ); fs.writeFileSync( @@ -58,4 +63,4 @@ const suiteCommon = [ }), ]; -export { suiteCommon }; +export { benchesPath, suiteCommon }; diff --git a/benches/worker_manager.ts b/benches/worker_manager.ts index 04468c7..20691e5 100644 --- a/benches/worker_manager.ts +++ b/benches/worker_manager.ts @@ -1,11 +1,14 @@ -import type { WorkerModule } from '@/worker'; -import path from 'path'; -import crypto from 'crypto'; +import type { WorkerModule } from '#worker.js'; +import path from 'node:path'; +import url from 'node:url'; +import crypto from 'node:crypto'; import b from 'benny'; import { spawn, Worker, Transfer } from 'threads'; import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; -import WorkerManager from '@/WorkerManager'; -import { suiteCommon } from './utils'; +import { suiteCommon } from './utils/index.js'; +import WorkerManager from '#WorkerManager.js'; + +const filePath = url.fileURLToPath(import.meta.url); const logger = new Logger('WorkerManager Bench', LogLevel.WARN, [ new StreamHandler(), @@ -22,7 +25,7 @@ async function main() { // 1 KiB of data is still too small const bytes = crypto.randomBytes(1024 * 1024); const summary = await b.suite( - path.basename(__filename, path.extname(__filename)), + path.basename(filePath, path.extname(filePath)), b.add('call overhead', async () => { // This calls a noop, this will show the overhead costs // All parallelised operation can never be faster than this @@ -104,8 +107,11 @@ async function main() { return summary; } -if (require.main === module) { - void main(); +if (import.meta.url.startsWith('file:')) { + const modulePath = url.fileURLToPath(import.meta.url); + if (process.argv[1] === modulePath) { + void main(); + } } export default main; diff --git a/jest.config.js b/jest.config.mjs similarity index 78% rename from jest.config.js rename to jest.config.mjs index 58d32f3..b3e3b3f 100644 --- a/jest.config.js +++ b/jest.config.mjs @@ -1,18 +1,16 @@ -const path = require('path'); -const { pathsToModuleNameMapper } = require('ts-jest'); -const { compilerOptions } = require('./tsconfig'); +import path from 'node:path'; +import url from 'node:url'; +import tsconfigJSON from './tsconfig.json' assert { type: "json" }; -const moduleNameMapper = pathsToModuleNameMapper(compilerOptions.paths, { - prefix: '/src/', -}); +const projectPath = path.dirname(url.fileURLToPath(import.meta.url)); // Global variables that are shared across the jest worker pool // These variables must be static and serializable const globals = { // Absolute directory to the project root - projectDir: __dirname, + projectDir: projectPath, // Absolute directory to the test root - testDir: path.join(__dirname, 'tests'), + testDir: path.join(projectPath, 'tests'), // Default asynchronous test timeout defaultTimeout: 20000, // Timeouts rely on setTimeout which takes 32 bit numbers @@ -24,7 +22,7 @@ const globals = { // They can however receive the process environment // Use `process.env` to set variables -module.exports = { +const config = { testEnvironment: 'node', verbose: true, collectCoverage: false, @@ -40,10 +38,10 @@ module.exports = { parser: { syntax: "typescript", tsx: true, - decorators: compilerOptions.experimentalDecorators, + decorators: tsconfigJSON.compilerOptions.experimentalDecorators, dynamicImport: true, }, - target: compilerOptions.target.toLowerCase(), + target: tsconfigJSON.compilerOptions.target.toLowerCase(), keepClassNames: true, }, } @@ -77,5 +75,10 @@ module.exports = { 'jest-extended/all', '/tests/setupAfterEnv.ts' ], - moduleNameMapper: moduleNameMapper, + moduleNameMapper: { + "^(\\.{1,2}/.*)\\.js$": "$1", + }, + extensionsToTreatAsEsm: ['.ts', '.tsx', '.mts'], }; + +export default config; diff --git a/package.json b/package.json index 2c3e966..d1b55ed 100644 --- a/package.json +++ b/package.json @@ -8,31 +8,45 @@ "type": "git", "url": "https://github.com/MatrixAI/js-workers.git" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + }, + "./*.js": { + "types": "./dist/*.d.ts", + "import": "./dist/*.js" + }, + "./*": "./dist/*" + }, + "imports": { + "#*": "./dist/*" + }, "scripts": { "prepare": "tsc -p ./tsconfig.build.json", "build": "shx rm -rf ./dist && tsc -p ./tsconfig.build.json", "postversion": "npm install --package-lock-only --ignore-scripts --silent", - "ts-node": "ts-node", - "test": "jest", - "lint": "eslint '{src,tests,scripts,benches}/**/*.{js,ts}'", - "lintfix": "eslint '{src,tests,scripts,benches}/**/*.{js,ts}' --fix", + "tsx": "tsx", + "test": "node ./scripts/test.mjs", + "lint": "eslint '{src,tests,scripts,benches}/**/*.{js,mjs,ts,mts,jsx,tsx}'", + "lintfix": "eslint '{src,tests,scripts,benches}/**/*.{js,mjs,ts,mts,jsx,tsx}' --fix", "lint-shell": "find ./src ./tests ./scripts -type f -regextype posix-extended -regex '.*\\.(sh)' -exec shellcheck {} +", "docs": "shx rm -rf ./docs && typedoc --gitRevision master --tsconfig ./tsconfig.build.json --out ./docs src", - "bench": "shx rm -rf ./benches/results && ts-node ./benches" + "bench": "tsc -p ./tsconfig.build.json && shx rm -rf ./benches/results && tsx ./benches/index.ts" }, "dependencies": { - "@matrixai/async-init": "^1.9.1", - "@matrixai/errors": "^1.2.0", - "@matrixai/logger": "^3.1.0", - "threads": "^1.6.5" + "@matrixai/async-init": "^2.0.0", + "@matrixai/errors": "^2.0.1", + "@matrixai/logger": "^4.0.1", + "threads": "^1.7.0" }, "devDependencies": { - "@swc/core": "1.3.82", + "@swc/core": "^1.3.76", "@swc/jest": "^0.2.29", "@types/jest": "^29.5.2", - "@types/node": "^20.5.7", + "@types/node": "^18.15.0", "@typescript-eslint/eslint-plugin": "^5.61.0", "@typescript-eslint/parser": "^5.61.0", "benny": "^3.7.1", @@ -47,9 +61,7 @@ "prettier": "^3.0.0", "shx": "^0.3.4", "systeminformation": "^5.18.5", - "ts-jest": "^29.1.1", - "ts-node": "^10.9.1", - "tsconfig-paths": "^3.9.0", + "tsx": "^3.12.7", "typedoc": "^0.24.8", "typescript": "^5.1.6" } diff --git a/scripts/test.mjs b/scripts/test.mjs new file mode 100644 index 0000000..1b398da --- /dev/null +++ b/scripts/test.mjs @@ -0,0 +1,47 @@ +#!/usr/bin/env node + +import os from 'node:os'; +import path from 'node:path'; +import url from 'node:url'; +import process from 'node:process'; +import childProcess from 'node:child_process'; + +const projectPath = path.dirname( + path.dirname(url.fileURLToPath(import.meta.url)), +); + +const platform = os.platform(); + +/* eslint-disable no-console */ +async function main() { + const tscArgs = [`-p`, path.join(projectPath, 'tsconfig.build.json')]; + console.error('Running tsc:'); + console.error(['tsc', ...tscArgs].join(' ')); + childProcess.execFileSync('tsc', tscArgs, { + stdio: ['inherit', 'inherit', 'inherit'], + windowsHide: true, + encoding: 'utf-8', + shell: platform === 'win32' ? true : false, + }); + const jestArgs = []; + console.error('Running jest:'); + console.error(['jest', ...jestArgs].join(' ')); + childProcess.execFileSync('jest', jestArgs, { + env: { + ...process.env, + NODE_OPTIONS: '--experimental-vm-modules', + }, + stdio: ['inherit', 'inherit', 'inherit'], + windowsHide: true, + encoding: 'utf-8', + shell: platform === 'win32' ? true : false, + }); +} +/* eslint-enable no-console */ + +if (import.meta.url.startsWith('file:')) { + const modulePath = url.fileURLToPath(import.meta.url); + if (process.argv[1] === modulePath) { + void main(); + } +} diff --git a/src/WorkerManager.ts b/src/WorkerManager.ts index 032a338..40a912a 100644 --- a/src/WorkerManager.ts +++ b/src/WorkerManager.ts @@ -1,11 +1,11 @@ import type { ModuleThread } from 'threads'; import type { ModuleMethods } from 'threads/dist/types/master'; +import type WorkerManagerInterface from './WorkerManagerInterface.js'; import type { QueuedTask } from 'threads/dist/master/pool-types'; -import type WorkerManagerInterface from './WorkerManagerInterface'; import { Pool } from 'threads'; import Logger from '@matrixai/logger'; -import { CreateDestroy, ready } from '@matrixai/async-init/dist/CreateDestroy'; -import * as errors from './errors'; +import { CreateDestroy, ready } from '@matrixai/async-init/CreateDestroy.js'; +import * as errors from './errors.js'; @CreateDestroy() class WorkerManager diff --git a/src/index.ts b/src/index.ts index afbcd75..b7c31a2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ -export { default as WorkerManager } from './WorkerManager'; -export { default as workerModule } from './workerModule'; -export * as errors from './errors'; +export { default as WorkerManager } from './WorkerManager.js'; +export { default as workerModule } from './workerModule.js'; +export * as errors from './errors.js'; -export type { default as WorkerManagerInterface } from './WorkerManagerInterface'; -export type { WorkerModule } from './workerModule'; +export type { default as WorkerManagerInterface } from './WorkerManagerInterface.js'; +export type { WorkerModule } from './workerModule.js'; diff --git a/src/worker.ts b/src/worker.ts index 89b3b70..0dafda0 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -2,8 +2,8 @@ // note that it cannot use `@/` imports import { expose } from 'threads/worker'; -import worker from '../src/workerModule'; +import worker from '../src/workerModule.js'; expose(worker); -export type { WorkerModule } from '../src/workerModule'; +export type { WorkerModule } from '../src/workerModule.js'; diff --git a/tests/WorkerManager.test.ts b/tests/WorkerManager.test.ts index 940b283..38b64e0 100644 --- a/tests/WorkerManager.test.ts +++ b/tests/WorkerManager.test.ts @@ -1,10 +1,10 @@ -import type { WorkerModule } from '@/worker'; +import type { WorkerModule } from '#worker.js'; import { spawn, Worker, Transfer } from 'threads'; import Logger, { LogLevel, StreamHandler } from '@matrixai/logger'; import { destroyed } from '@matrixai/async-init'; -import WorkerManager from '@/WorkerManager'; -import * as errors from '@/errors'; -import * as testUtils from './utils'; +import * as testUtils from './utils.js'; +import WorkerManager from '#WorkerManager.js'; +import * as errors from '#errors.js'; describe('WorkerManager', () => { const logger = new Logger('WorkerManager Test', LogLevel.WARN, [ diff --git a/tests/setup.ts b/tests/setup.ts index e69de29..73bf649 100644 --- a/tests/setup.ts +++ b/tests/setup.ts @@ -0,0 +1,3 @@ +import { jest } from '@jest/globals'; + +globalThis.jest = jest; diff --git a/tsconfig.json b/tsconfig.json index 3d794c9..2c91a1f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,18 +9,19 @@ "strictNullChecks": true, "noImplicitAny": false, "experimentalDecorators": true, + "emitDecoratorMetadata": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, "resolveJsonModule": true, - "skipLibCheck": true, - "moduleResolution": "node", - "module": "CommonJS", + "isolatedModules": true, + "moduleResolution": "NodeNext", + "module": "ESNext", "target": "ES2022", "baseUrl": "./src", "paths": { - "@": ["index"], - "@/*": ["*"] + "#*": ["*"] }, + "skipLibCheck": true, "noEmit": true }, "include": [ @@ -29,10 +30,5 @@ "./tests/**/*", "./scripts/**/*", "./benches/**/*" - ], - "ts-node": { - "require": ["tsconfig-paths/register"], - "transpileOnly": true, - "swc": true - } + ] } From d5bf19db0794014f43bfe41c948721628f07ee5b Mon Sep 17 00:00:00 2001 From: Roger Qiu Date: Mon, 28 Aug 2023 14:28:54 +1000 Subject: [PATCH 2/2] feat: conversion to using internal `node:worker_threads` implementation to enable support for ESM --- benches/results/metrics.txt | 60 +- benches/results/system.json | 44 +- benches/results/worker_manager.chart.html | 14 +- benches/results/worker_manager.json | 1867 ++++++++++---------- benches/results/worker_manager_metrics.txt | 60 +- benches/worker_manager.ts | 35 +- package-lock.json | 1216 +++++++++---- package.json | 9 +- src/WorkerManager.ts | 128 +- src/WorkerManagerInterface.ts | 15 - src/WorkerPool.ts | 283 +++ src/errors.ts | 53 +- src/expose.ts | 48 + src/index.ts | 6 +- src/types.ts | 38 + src/worker.ts | 58 +- src/workerModule.ts | 47 - tests/WorkerManager.test.ts | 250 +-- tests/WorkerPool.test.ts | 103 ++ tsconfig.json | 7 +- 20 files changed, 2673 insertions(+), 1668 deletions(-) delete mode 100644 src/WorkerManagerInterface.ts create mode 100644 src/WorkerPool.ts create mode 100644 src/expose.ts create mode 100644 src/types.ts delete mode 100644 src/workerModule.ts create mode 100644 tests/WorkerPool.test.ts diff --git a/benches/results/metrics.txt b/benches/results/metrics.txt index a6a167c..e2e7d6a 100644 --- a/benches/results/metrics.txt +++ b/benches/results/metrics.txt @@ -1,35 +1,35 @@ # TYPE worker_manager_ops gauge -worker_manager_ops{name="call overhead"} 854 -worker_manager_ops{name="parallel call overhead"} 439 -worker_manager_ops{name="parallel queue overhead"} 438 -worker_manager_ops{name="json stringify of 1 MiB of data"} 18 -worker_manager_ops{name="base64 of 1 MiB of data"} 3981 -worker_manager_ops{name="md5 Hash of 1 MiB of data"} 759 -worker_manager_ops{name="sha256 Hash of 1 MiB of data"} 1887 -worker_manager_ops{name="sha512 Hash of 1 MiB of data"} 676 -worker_manager_ops{name="transfer Overhead"} 793 -worker_manager_ops{name="slice-Copy of 1 MiB of data"} 8508 +worker_manager_ops{name="call overhead"} 778 +worker_manager_ops{name="parallel call overhead"} 395 +worker_manager_ops{name="parallel queue overhead"} 400 +worker_manager_ops{name="json stringify of 1 MiB of data"} 30 +worker_manager_ops{name="base64 of 1 MiB of data"} 5144 +worker_manager_ops{name="md5 Hash of 1 MiB of data"} 820 +worker_manager_ops{name="sha256 Hash of 1 MiB of data"} 1908 +worker_manager_ops{name="sha512 Hash of 1 MiB of data"} 788 +worker_manager_ops{name="transfer Overhead"} 1583 +worker_manager_ops{name="slice-Copy of 1 MiB of data"} 5795 # TYPE worker_manager_margin gauge -worker_manager_margin{name="call overhead"} 0.55 -worker_manager_margin{name="parallel call overhead"} 0.53 -worker_manager_margin{name="parallel queue overhead"} 0.49 -worker_manager_margin{name="json stringify of 1 MiB of data"} 1.59 -worker_manager_margin{name="base64 of 1 MiB of data"} 2.71 -worker_manager_margin{name="md5 Hash of 1 MiB of data"} 1.1 -worker_manager_margin{name="sha256 Hash of 1 MiB of data"} 0.15 -worker_manager_margin{name="sha512 Hash of 1 MiB of data"} 0.74 -worker_manager_margin{name="transfer Overhead"} 0.61 -worker_manager_margin{name="slice-Copy of 1 MiB of data"} 1.33 +worker_manager_margin{name="call overhead"} 1.36 +worker_manager_margin{name="parallel call overhead"} 1.19 +worker_manager_margin{name="parallel queue overhead"} 0.82 +worker_manager_margin{name="json stringify of 1 MiB of data"} 5.79 +worker_manager_margin{name="base64 of 1 MiB of data"} 3.84 +worker_manager_margin{name="md5 Hash of 1 MiB of data"} 1.83 +worker_manager_margin{name="sha256 Hash of 1 MiB of data"} 0.81 +worker_manager_margin{name="sha512 Hash of 1 MiB of data"} 1.6 +worker_manager_margin{name="transfer Overhead"} 6.94 +worker_manager_margin{name="slice-Copy of 1 MiB of data"} 7.96 # TYPE worker_manager_samples counter -worker_manager_samples{name="call overhead"} 88 -worker_manager_samples{name="parallel call overhead"} 85 -worker_manager_samples{name="parallel queue overhead"} 89 -worker_manager_samples{name="json stringify of 1 MiB of data"} 48 -worker_manager_samples{name="base64 of 1 MiB of data"} 71 -worker_manager_samples{name="md5 Hash of 1 MiB of data"} 93 -worker_manager_samples{name="sha256 Hash of 1 MiB of data"} 96 -worker_manager_samples{name="sha512 Hash of 1 MiB of data"} 94 -worker_manager_samples{name="transfer Overhead"} 84 -worker_manager_samples{name="slice-Copy of 1 MiB of data"} 88 +worker_manager_samples{name="call overhead"} 80 +worker_manager_samples{name="parallel call overhead"} 80 +worker_manager_samples{name="parallel queue overhead"} 80 +worker_manager_samples{name="json stringify of 1 MiB of data"} 55 +worker_manager_samples{name="base64 of 1 MiB of data"} 72 +worker_manager_samples{name="md5 Hash of 1 MiB of data"} 91 +worker_manager_samples{name="sha256 Hash of 1 MiB of data"} 93 +worker_manager_samples{name="sha512 Hash of 1 MiB of data"} 92 +worker_manager_samples{name="transfer Overhead"} 59 +worker_manager_samples{name="slice-Copy of 1 MiB of data"} 67 diff --git a/benches/results/system.json b/benches/results/system.json index d0a34e7..b7e5dfe 100644 --- a/benches/results/system.json +++ b/benches/results/system.json @@ -1,41 +1,41 @@ { "cpu": { - "manufacturer": "AMD", - "brand": "Ryzen 7 2700X Eight-Core Processor", - "vendor": "AMD", - "family": "23", - "model": "8", + "manufacturer": "Intel", + "brand": "Gen Intel® Core™ i7-1370P", + "vendor": "Intel", + "family": "6", + "model": "186", "stepping": "2", "revision": "", "voltage": "", - "speed": 3.7, - "speedMin": 2.2, - "speedMax": 3.7, - "governor": "performance", - "cores": 16, - "physicalCores": 8, - "performanceCores": 8, - "efficiencyCores": 0, + "speed": 1.62, + "speedMin": 0.4, + "speedMax": 5.2, + "governor": "powersave", + "cores": 20, + "physicalCores": 14, + "performanceCores": 6, + "efficiencyCores": 8, "processors": 1, "socket": "", - "flags": "fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf rapl pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca sev sev_es", + "flags": "fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb intel_pt sha_ni xsaveopt xsavec xgetbv1 xsaves split_lock_detect user_shstk avx_vnni dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp hwp_pkg_req hfi vnmi umip pku ospke waitpkg gfni vaes vpclmulqdq tme rdpid movdiri movdir64b fsrm md_clear serialize pconfig arch_lbr ibt flush_l1d arch_capabilities", "virtualization": true, "cache": { - "l1d": 262144, - "l1i": 524288, - "l2": 4194304, - "l3": 16777216 + "l1d": 557056, + "l1i": 720896, + "l2": 11534336, + "l3": 25165824 } }, "osInfo": { "platform": "linux", "distro": "nixos", - "release": "22.11", - "kernel": "6.1.23", + "release": "24.11", + "kernel": "6.6.47", "arch": "x64" }, "system": { - "model": "System Product Name", - "manufacturer": "System manufacturer" + "model": "Precision 3480", + "manufacturer": "Dell Inc." } } \ No newline at end of file diff --git a/benches/results/worker_manager.chart.html b/benches/results/worker_manager.chart.html index 3732f36..bd5124c 100644 --- a/benches/results/worker_manager.chart.html +++ b/benches/results/worker_manager.chart.html @@ -28,7 +28,7 @@
- +