我正在寻找(或计算)Android设备的嵌入式处理器中的核心数量。
我尝试使用/proc/cpuinfo
,但它没有返回设备的核心数量!
我没有在互联网上的任何地方找到代码。这里有谁知道我怎么能确定这个,那么请回答。提前致谢
更新
这个问题How can you detect a dual-core cpu on an Android device from code?的答案在某些设备上运行不佳。我测试的是双核心和双核心。四核处理器,他们返回2&分别为4,罚款!
但是,在三星Note 3中的 Octa Core 处理器上,它返回 4 。 (或许在注3中有2套四核处理器单独运行)
我本来想解决这个问题。
更新
应用 CPU-Z 正在我的设备Samsung note 3中返回正确的核心数 这似乎存在一种可能的解决方案......
答案 0 :(得分:44)
您可以结合使用上述答案。这样,它将在运行API 17+的设备上执行得更快,因为这种方法比过滤文件要快得多。
private int getNumberOfCores() {
if(Build.VERSION.SDK_INT >= 17) {
return Runtime.getRuntime().availableProcessors()
}
else {
// Use saurabh64's answer
return getNumCoresOldPhones();
}
}
/**
* Gets the number of cores available in this device, across all processors.
* Requires: Ability to peruse the filesystem at "/sys/devices/system/cpu"
* @return The number of cores, or 1 if failed to get result
*/
private int getNumCoresOldPhones() {
//Private Class to display only CPU devices in the directory listing
class CpuFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
//Check if filename is "cpu", followed by a single digit number
if(Pattern.matches("cpu[0-9]+", pathname.getName())) {
return true;
}
return false;
}
}
try {
//Get directory containing CPU info
File dir = new File("/sys/devices/system/cpu/");
//Filter to only list the devices we care about
File[] files = dir.listFiles(new CpuFilter());
//Return the number of cores (virtual CPU devices)
return files.length;
} catch(Exception e) {
//Default to return 1 core
return 1;
}
}
public int availableProcessors()
在API级别1中添加返回可用的处理器核心数 到VM,至少1.传统上这返回了数字 目前在线,但许多移动设备都可以使用未使用的 脱机核心以节省电力,因此发布比Android 4.2更新(Jelly Bean)返回可用的最大核心数 如果没有电力或热量限制。
还有关于文件内核心数量的信息
/sys/devices/system/cpu/present
它以以下格式报告可用CPU的数量:
等
另请注意注释3
中/sys/devices/system/cpu/possible
内的内容
这两个文件都设置了r--r--r--
或444
文件权限,因此您应该能够在代码中没有root设备的情况下阅读它们。
编辑:发布代码以帮助您
private void printNumberOfCores() {
printFile("/sys/devices/system/cpu/present");
printFile("/sys/devices/system/cpu/possible");
}
private void printFile(String path) {
InputStream inputStream = null;
try {
inputStream = new FileInputStream(path);
if (inputStream != null) {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line;
do {
line = bufferedReader.readLine();
Log.d(path, line);
} while (line != null);
}
} catch (Exception e) {
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
}
}
}
}
结果
D//sys/devices/system/cpu/present﹕ 0-3
D//sys/devices/system/cpu/possible﹕ 0-3
测试在OnePlus One上运行,运行带有Android v5.1.1的BlissPop ROM,并按照应有的方式进行打印。请试试你的三星
答案 1 :(得分:5)
试试这个:
Runtime.getRuntime().availableProcessors();
这会返回我所体验的特定虚拟机可用CPU的数量。这可能不是你想要的,但是,出于一些目的,这是非常方便的。您可以非常轻松地测试它:杀死所有应用程序,运行上面的代码。打开10个非常密集的应用程序,然后再次运行测试。当然,我认为这只适用于多CPU设备。
答案 2 :(得分:5)
首先,似乎这是不可能的,这里有一些信息:
我们将使用三星Exynos 5 Octa CPU作为此线程的示例,但通常任何ARM处理器都可以正常工作。
三星Exynos 5 Octa CPU有8个CPU核心。但实际上它有两个进程,每个进程有4个核心。这叫做big.LITTLE。你有1个快速处理器和1个节能处理器。
在Exynos 5 CPU中,它内置两个不同的CPU,一个Cortex a15和一个Cortex a7 ......
在big.LITTLE中,两个CPU都无法同时运行,在任何给定时间只能有一个CPU处于活动状态......
但也有一些名为“big.LITTLE mp”的东西,其中两个CPU可以同时处于活动状态,但这里是捕获(再次!)在任何给定时间,只有四个核可以对软件有效。这是一张更好地解释这一点的图片:
现在您可以看到,此处功能更强大的处理器使用单个CPU内核,然后其他四个内核从更节能的a7 CPU群集中激活。
您可以在此处阅读有关big.LITTLE架构的更多信息: http://www.arm.com/products/processors/technologies/biglittleprocessing.php
您可以在此处阅读有关big.LITTLE mp架构的更多信息: http://www.arm.com/products/processors/technologies/biglittleprocessing.php
您现在想要了解的是,是否可以知道CPU架构是Big.LITTLE还是BIG.LITTLE mp。然后看看你是否可以直接找出每个CPU的CPU数量,但我找不到任何相关的代码。 ARMs网站上有很多文档,但我不太确定是否可以获取这些信息。无论哪种方式,只能使用4个CPU内核,因此您拥有的代码在技术上是正确的,因为这是可用内核的数量。
我希望这有帮助,如果您有任何疑问或想要清理任何事情,请告诉我。那里有很多信息
答案 3 :(得分:3)
您可以尝试使用此方法获取核心数量。
private int getNumOfCores()
{
try
{
int i = new File("/sys/devices/system/cpu/").listFiles(new FileFilter()
{
public boolean accept(File params)
{
return Pattern.matches("cpu[0-9]", params.getName());
}
}).length;
return i;
}
catch (Exception e)
{
e.printstacktrace();
}
return 1;
}
答案 4 :(得分:1)
使用此选项获取否。核心。请仔细阅读此链接,并了解作者试图在虚拟设备和真实设备之间分析的内容。
代码来自THIS SITE
/**
* Gets the number of cores available in this device, across all processors.
* Requires: Ability to peruse the filesystem at "/sys/devices/system/cpu"
* @return The number of cores, or 1 if failed to get result
*/
private int getNumCores() {
//Private Class to display only CPU devices in the directory listing
class CpuFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
//Check if filename is "cpu", followed by a single digit number
if(Pattern.matches("cpu[0-9]+", pathname.getName())) {
return true;
}
return false;
}
}
try {
//Get directory containing CPU info
File dir = new File("/sys/devices/system/cpu/");
//Filter to only list the devices we care about
File[] files = dir.listFiles(new CpuFilter());
Log.d(TAG, "CPU Count: "+files.length);
//Return the number of cores (virtual CPU devices)
return files.length;
} catch(Exception e) {
//Print exception
Log.d(TAG, "CPU Count: Failed.");
e.printStackTrace();
//Default to return 1 core
return 1;
}
}
答案 5 :(得分:0)
好的是使用JNI,如果可能的话在项目中使用
的std ::螺纹:: hardware_concurrency()
答案 6 :(得分:0)
kotlin中简单而又不错的解决方案:
SELECT DepartmentName, AvgDepartmentSalary
FROM (SELECT DepartmentName, AVG(Salary) AS AvgDepartmentSalary
FROM employees
GROUP BY DepartmentName) g
JOIN (SELECT AVG(Salary) AS AverageSalary
FROM employee) u ON AvgDepartmentSalary > AverageSalary
答案 7 :(得分:0)
您在这里(JAVA):
try {
int ch, processorCount = 0;
Process process = Runtime.getRuntime().exec("cat /proc/cpuinfo");
StringBuilder sb = new StringBuilder();
while ((ch = process.getInputStream().read()) != -1)
sb.append((char) ch);
Pattern p = Pattern.compile("processor");
Matcher m = p.matcher(sb.toString());
while (processorCount.find())
processorCount++;
System.out.println(processorCount);
} catch (IOException e) {
e.printStackTrace();
}