459 votes

Trouver le nombre de cœurs en Java

Comment puis-je trouver le nombre de cœurs disponibles pour mon application à partir du code Java ?

3 votes

Dans la plupart des cas, "core == processeur".

36 votes

Il est difficile de trouver le nombre de cœurs que possède physiquement la machine en utilisant uniquement Java. Trouver le nombre de cœurs que le programme Java peut utiliser au démarrage est facile, en utilisant la fonction Runtime.getRuntime().availableProcessors() . En raison de la capacité de tous les principaux systèmes d'exploitation modernes à définir l'affinité du processeur (c'est-à-dire à restreindre une application à un certain nombre de cœurs), c'est une préoccupation à garder à l'esprit.

10 votes

Cœurs logiques ou physiques ? Il y a une différence importante.

830voto

darioo Points 23903
int cores = Runtime.getRuntime().availableProcessors();

Si cores est inférieur à un, soit votre processeur est sur le point de mourir, soit votre JVM présente un grave bug, soit l'univers est sur le point d'exploser.

0 votes

Pas de problème, puisque la plupart des informations recueillies auprès des Runtime est une chaîne de caractères, j'ai pensé qu'il serait utile de montrer que celle-ci renvoie une chaîne de caractères. int .

134 votes

Cela vous donnera le nombre de threads logiques. Par exemple, si vous avez activé l'hyper-threading, le nombre de cœurs sera doublé.

7 votes

@Peter, oui, bon point. Je me sentais roi de la colline en effectuant cette action avec ma machine i7 ! :)

34voto

adi9090 Points 344

Si vous souhaitez obtenir le nombre de cœurs physiques, vous pouvez exécuter la commande cmd et terminal et ensuite analyser la sortie pour obtenir les informations dont vous avez besoin.

private int getNumberOfCPUCores() {
    OSValidator osValidator = new OSValidator();
    String command = "";
    if(osValidator.isMac()){
        command = "sysctl -n machdep.cpu.core_count";
    }else if(osValidator.isUnix()){
        command = "lscpu";
    }else if(osValidator.isWindows()){
        command = "cmd /C WMIC CPU Get /Format:List";
    }
    Process process = null;
    int numberOfCores = 0;
    int sockets = 0;
    try {
        if(osValidator.isMac()){
            String[] cmd = { "/bin/sh", "-c", command};
            process = Runtime.getRuntime().exec(cmd);
        }else{
            process = Runtime.getRuntime().exec(command);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    BufferedReader reader = new BufferedReader(
            new InputStreamReader(process.getInputStream()));
    String line;

    try {
        while ((line = reader.readLine()) != null) {
            if(osValidator.isMac()){
                numberOfCores = line.length() > 0 ? Integer.parseInt(line) : 0;
            }else if (osValidator.isUnix()) {
                if (line.contains("Core(s) per socket:")) {
                    numberOfCores = Integer.parseInt(line.split("\\s+")[line.split("\\s+").length - 1]);
                }
                if(line.contains("Socket(s):")){
                    sockets = Integer.parseInt(line.split("\\s+")[line.split("\\s+").length - 1]);
                }
            } else if (osValidator.isWindows()) {
                if (line.contains("NumberOfCores")) {
                    numberOfCores = Integer.parseInt(line.split("=")[1]);
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    if(osValidator.isUnix()){
        return numberOfCores * sockets;
    }
    return numberOfCores;
}

Classe OSValidator :

public class OSValidator {

private static String OS = System.getProperty("os.name").toLowerCase();

public static void main(String[] args) {

    System.out.println(OS);

    if (isWindows()) {
        System.out.println("This is Windows");
    } else if (isMac()) {
        System.out.println("This is Mac");
    } else if (isUnix()) {
        System.out.println("This is Unix or Linux");
    } else if (isSolaris()) {
        System.out.println("This is Solaris");
    } else {
        System.out.println("Your OS is not support!!");
    }
}

public static boolean isWindows() {
    return (OS.indexOf("win") >= 0);
}

public static boolean isMac() {
    return (OS.indexOf("mac") >= 0);
}

public static boolean isUnix() {
    return (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0 );
}

public static boolean isSolaris() {
    return (OS.indexOf("sunos") >= 0);
}
public static String getOS(){
    if (isWindows()) {
        return "win";
    } else if (isMac()) {
        return "osx";
    } else if (isUnix()) {
        return "uni";
    } else if (isSolaris()) {
        return "sol";
    } else {
        return "err";
    }
}

}

4 votes

C'est un morceau de code qui est un bon candidat pour être OOPed :)

1 votes

La classe OSValidator supporte OSX, mais le getNumberOfCores l'ignore complètement. Pour l'anecdote, blog.opengroup.org/2015/10/02/ donc 'Mac' devrait être dans votre isUnix() mais... Pour BSD, OSX, aucune commande lscpu n'existe et votre getNumberOfCores retournera 0.

1 votes

Sous Linux, vous devez multiplier "Core(s) per socket" par "Socket(s)". De plus, j'utiliserais des expressions régulières.

10voto

Antonio Points 457

Il s'agit d'un moyen supplémentaire de connaître le nombre de cœurs du processeur (et beaucoup d'autres informations), mais ce code nécessite une dépendance supplémentaire :

Système d'exploitation natif et informations sur le matériel https://github.com/oshi/oshi

SystemInfo systemInfo = new SystemInfo();
HardwareAbstractionLayer hardwareAbstractionLayer = systemInfo.getHardware();
CentralProcessor centralProcessor = hardwareAbstractionLayer.getProcessor();

Obtenez le nombre de CPU logiques disponibles pour le traitement :

centralProcessor.getLogicalProcessorCount();

1 votes

Cela vous permettra également d'utiliser centralProcessor.getPhysicalProcessorCount(), qui est probablement actuellement le meilleur moyen en java d'obtenir cette information. Si vous avez des threads qui ont presque constamment du travail à faire, et que vous voulez connaître le nombre de ces threads que vous pouvez lancer tout en laissant un reste bien défini de capacité CPU pour d'autres threads et processus, c'est sur ce nombre que le calcul doit se baser.

1voto

Si vous voulez faire un doute, vérifiez le nombre de cœurs dont vous disposez sur votre machine par rapport au nombre que votre programme java vous donne.

Dans le terminal Linux : lscpu

Dans le terminal Windows (cmd) : echo %NUMBER_OF_PROCESSORS%

Dans le terminal Mac : sysctl -n hw.ncpu

-6voto

Lyle Z Points 37

Cela fonctionne sous Windows avec Cygwin installé :

System.getenv("NUMBER_OF_PROCESSORS")

0 votes

J'ai installé Cygwin, mais cela fonctionne à partir du shell Windows : groovy -e "println System.getenv('NUMBER_OF_PROCESSORS')"

0 votes

Je ne sais pas si c'est une variable d'environnement standard de Windows, mais.. : set NUMBER_OF_PROCESSORS fonctionne à partir de la ligne de commande Windows pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X