Mein Mac ist mit 16 Kernen bestückt.Verschlechterungsleistung bei steigender Anzahl der Kerne
System.out.println(Runtime.getRuntime().availableProcessors()); //16
Ich führe den Code unten, um die Wirksamkeit der Verwendung meiner Kerne zu sehen. Der Faden ‚CountFileLineThread‘ zählt einfach die Anzahl der Zeilen in einer Datei (Es gibt 133 Dateien in einem Ordner)
ich Notizen auf dieser Linie unter:
ExecutorService es = Executors.newFixedThreadPool(NUM_CORES);
Wo NUM_CORES zwischen 1 bis 16 ist .
Sie werden aus dem Ergebnis unten feststellen, dass oberhalb von 5 Kernen die Leistung beginnt sich zu verschlechtern. Ich würde nicht erwarten, ein 'Produkt der abnehmenden Rendite' für 6 Kerne und höher (übrigens, für 7 Kerne dauert es über 22 Minuten, hallo?!?!) Meine Frage ist warum?
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);
}
}
Weil Ihr Test Datei-I/O macht, haben Sie wahrscheinlich einen Punkt mit diesem 6. Thread erreicht, wo Sie jetzt zu viel I/O machen und somit alles verlangsamen. – cmbaxter
Ich denke, das ist ein E/A-gebundener Job und kein CPU-gebundener Job. Das Hinzufügen weiterer Threads führt nur dazu, dass die Festplatte unregelmäßige Muster auf der Festplatte erhält und zwischen verschiedenen Dateien navigiert (im Gegensatz zur aufeinanderfolgenden Position für eine einzelne Datei, die auf einer regelmäßig defragmentierten Festplatte in einem modernen Betriebssystem erwartet wird). – nhahtdh
Bei dieser Art von Test ist nur die Anzahl der Kerne nicht relevant, wenn der Code nur im Arbeitsspeicher ausgeführt wird. Sobald ein I/O hinzugefügt wurde, während ein Thread eine Datei gelesen hat, müssen alle anderen warten. –