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);
}
}