-
-
Save brandon93s/a46fb07b0dd589dc34e987c33d775679 to your computer and use it in GitHub Desktop.
| // Source of https://www.npmjs.com/package/physical-cpu-count | |
| 'use strict' | |
| const os = require('os') | |
| const childProcess = require('child_process') | |
| function exec (command) { | |
| const output = childProcess.execSync(command, {encoding: 'utf8'}) | |
| return output | |
| } | |
| let amount | |
| const platform = os.platform() | |
| if (platform === 'linux') { | |
| const output = exec('lscpu -p | egrep -v "^#" | sort -u -t, -k 2,4 | wc -l') | |
| amount = parseInt(output.trim(), 10) | |
| } else if (platform === 'darwin') { | |
| const output = exec('sysctl -n hw.physicalcpu_max') | |
| amount = parseInt(output.trim(), 10) | |
| } else if (platform === 'windows') { | |
| const output = exec('WMIC CPU Get NumberOfCores') | |
| amount = output.split(os.EOL) | |
| .map(function parse (line) { return parseInt(line) }) | |
| .filter(function numbers (value) { return !isNaN(value) }) | |
| .reduce(function add (sum, number) { return sum + number }, 0) | |
| } else { | |
| const cores = os.cpus().filter(function (cpu, index) { | |
| const hasHyperthreading = cpu.model.includes('Intel') | |
| const isOdd = index % 2 === 1 | |
| return !hasHyperthreading || isOdd | |
| }) | |
| amount = cores.length | |
| } | |
| module.exports = amount |
os.cpus() is not the same thing - it will return the logical cores, and the code above gives you physical cores. If you have an Intel CPU with hyperthreading enabled, and have 4 physical cores, os.cpus().length will be 8, but you actually have 4 physical cores. If you want 8 for some reason, os.cpus() will give you what you want but if you want 4 (most likely what you want) then you need the above code.
I think this is not working for my AMD Ryzen 7 1800x. I'm still getting 16 instead of 8
That's because os.platform() returns 'win32' for windows and not 'windows' as here. Check my fork for proper solution.
I am getting 'win32' for windows, so it falls back to the cpus(). I changed it to else if (platform === 'windows' || platform === 'win32') {
Node 18.14.0 and newer support os.availableParallelism() which should be used instead of os.cpus().length, this still only returns the number of logical processors, not the number of physical processors.
In a simpler way, with Node JS : os.cpus()
The length of this array is the number of "processors" in the system. Most systems only have one CPU, so that's the number of cores of that CPU.