Pogarszająca się wydajność przy rosnącej liczbie rdzeni

Mój Mac jest uzbrojony w 16 rdzeni.

System.out.println(Runtime.getRuntime().availableProcessors());  //16

Używam poniższego kodu, aby zobaczyć skuteczność wykorzystania moich rdzeni. Wątek „CountFileLineThread” po prostu zlicza liczbę wierszy w pliku (w folderze znajduje się 133 plików)

Robię notatki w tej linii:

ExecutorService es = Executors.newFixedThreadPool(NUM_CORES);

Gdzie NUM_CORES wynosi od 1 do 16.

Z wyniku poniżej zauważysz, że powyżej 5 rdzeni wydajność zaczyna się pogarszać. Nie spodziewałbym się „produktu malejącego zwrotu” dla 6 rdzeni i powyżej (btw, dla 7 rdzeni zajmie to ponad 22 minuty, cześć?!?!) Moje pytanie brzmi: dlaczego?

public class TestCores
{   
  public static void main(String args[]) throws Exception
  {
    long start = System.currentTimeMillis();
    System.out.println("START");

    int NUM_CORES = 1;

    List<File> files = Util.getFiles("/Users/adhg/Desktop/DEST/");
    System.out.println("total files: "+files.size());
    ExecutorService es = Executors.newFixedThreadPool(NUM_CORES);
    List<Future<Integer>> futures = new ArrayList<Future<Integer>>();
    for (File file : files)
    {
        Future<Integer> future = es.submit(new CountFileLineThread(file));
        futures.add(future);
    }

    Integer total = 0;

    for (Future<Integer> future : futures)
    {
        Integer result = future.get();
        total+=result;
        System.out.println("result :"+result);

    }

    System.out.println("----->"+total);

    long end = System.currentTimeMillis();
    System.out.println("END. "+(end-start)/1000.0);
}
}

questionAnswers(3)

yourAnswerToTheQuestion