private static Concurrency estimateConcurrency()

in surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerUtil.java [125:158]


    private static Concurrency estimateConcurrency(JUnitCoreParameters params, RunnerCounter counts) {
        final Concurrency concurrency = new Concurrency();
        final int parallelEntities = countParallelEntities(params);
        concurrency.capacity = multiplyByCoreCount(params, params.getThreadCount());
        if (parallelEntities == 1 || counts == null || counts.classes == 0) {
            // Estimate parallel thread counts.
            double ratio = 1d / parallelEntities;
            int threads = multiplyByCoreCount(params, ratio * params.getThreadCount());
            concurrency.suites = params.isParallelSuites() ? minSuites(threads, counts) : 0;
            concurrency.classes = params.isParallelClasses() ? minClasses(threads, counts) : 0;
            concurrency.methods = params.isParallelMethods() ? minMethods(threads, counts) : 0;
            if (parallelEntities == 1) {
                concurrency.capacity = 0;
            } else {
                adjustLeaf(params, concurrency);
            }
        } else {
            // Try to allocate suites+classes+methods within threadCount,
            concurrency.suites = params.isParallelSuites() ? toNonNegative(counts.suites) : 0;
            concurrency.classes = params.isParallelClasses() ? toNonNegative(counts.classes) : 0;
            concurrency.methods =
                    params.isParallelMethods() ? toNonNegative(Math.ceil(counts.methods / (double) counts.classes)) : 0;
            double sum = toNonNegative(concurrency.suites + concurrency.classes + concurrency.methods);
            if (concurrency.capacity < sum && sum != 0) {
                // otherwise allocate them using the weighting factor < 1.
                double weight = concurrency.capacity / sum;
                concurrency.suites *= weight;
                concurrency.classes *= weight;
                concurrency.methods *= weight;
            }
            adjustLeaf(params, concurrency);
        }
        return concurrency;
    }