Mój komputer jest uzbrojony w 16 rdzeni.Obniżanie wydajności przy zwiększaniu liczby rdzeni
System.out.println(Runtime.getRuntime().availableProcessors()); //16
Używam poniższego kodu, aby zobaczyć efektywność wykorzystania moich rdzeni. Wątek „CountFileLineThread” po prostu policzyć liczbę wierszy w pliku (Istnieją 133 plików w folderze)
Biorę notatki na tej linii:
ExecutorService es = Executors.newFixedThreadPool(NUM_CORES);
Gdzie NUM_CORES wynosi od 1 do 16
Z powyższego wyniku zauważysz, że powyżej 5 rdzeni wydajność zaczyna spadać. Nie spodziewałbym się "produktu o malejącym zwrocie" dla 6 rdzeni i więcej (przy okazji, dla 7 rdzeni zajmuje to 22 minuty, witam?!?!) 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);
}
}
Ponieważ twój test wykonuje operacje wejścia/wyjścia pliku, prawdopodobnie trafiłeś w punkt z tym szóstym wątkiem, w którym robisz teraz zbyt wiele operacji we/wy, co spowalnia wszystko. – cmbaxter
Myślę, że jest to praca związana IO, a nie praca związana z CPU. Dodanie większej liczby wątków powoduje, że dysk twardy ma nieregularny wzór na dysku, poruszając się pomiędzy kilkoma różnymi plikami (w przeciwieństwie do kolejnych pozycji dla pojedynczego pliku, co jest oczekiwane na regularnie defragmentowanym dysku w nowoczesnym systemie operacyjnym). – nhahtdh
W przypadku tego rodzaju testu sama liczba rdzeni nie ma znaczenia, gdy kod działa tylko w pamięci. Po dodaniu operacji we/wy, gdy wątek czyta plik, wszystkie pozostałe muszą poczekać. –