ExecutorService медленная многопоточная производительность

Я пытаюсь выполнить простое вычисление (он вызывает Math.random () 10000000 раз). Удивительно, но запуск его простым методом выполняется намного быстрее, чем при использовании ExecutorService.

Я прочитал другой поток в удивительной точке безубыточности производительности ExecutorService --- эмпирические правила? и попытался выполнить ответ, выполнив Callable с использованием пакетов, но производительность по-прежнему низкая

Как мне улучшить производительность на основе моего текущего кода?

import java.util.*;
import java.util.concurrent.*;

public class MainTest {
    public static void main(String[]args) throws Exception {
        new MainTest().start();;
    }

    final List workermulti = new ArrayList();
    final List workersingle = new ArrayList();
    final int count=10000000;

    public void start() throws Exception {
        int n=2;

        workersingle.add(new Worker(1));
        for (int i=0;i simple = new ArrayList();
        List single = new ArrayList();
        List multi = new ArrayList();

        for (int i=0;i list) {
        long sum=0;
        for (long l : list) {
            sum+=l;
        }
        return sum;
    }

    private void simple() {
        for (int i=0;i {
        int n;

        public Worker(int n) {
            this.n=n;
        }

        @Override
        public Void call() throws Exception {
            // divide count with n to perform batch execution
            for (int i=0;i<(count/n);i++) {
                Math.random();
            }
            return null;
        }
    }
}

Результат этого кода

Average simple: 920 ms
Average single thread: 1034 ms
Average multi thread: 1393 ms

EDIT: производительность снижается из-за математики .random () является синхронизированным методом .. после изменения Math.random ()с новым объектом Random для каждого потока производительность улучшилась

Вывод для нового кода (после замены Math.random () на Random для каждого потока)

Average simple: 928 ms
Average single thread: 1046 ms
Average multi thread: 642 ms

6
задан Community 23 May 2017 в 12:13
поделиться