Máy mac của tôi được trang bị 16 lõi.Giảm hiệu suất khi tăng số lượng lõi
System.out.println(Runtime.getRuntime().availableProcessors()); //16
Tôi đang chạy mã bên dưới để xem hiệu quả của việc sử dụng lõi của tôi. Các chủ đề 'CountFileLineThread' chỉ đơn giản là đếm số lượng các dòng trong một tập tin (Có 133 tập tin trong một thư mục)
Tôi đang ghi chép trên dòng này:
ExecutorService es = Executors.newFixedThreadPool(NUM_CORES);
đâu NUM_CORES là giữa 1-16
Bạn sẽ lưu ý từ kết quả dưới 5 lõi mà hiệu suất bắt đầu giảm xuống. Tôi sẽ không mong đợi một 'sản phẩm giảm dần' cho 6 lõi trở lên (btw, đối với 7 lõi phải mất hơn 22 phút, xin chào?!?!) Câu hỏi của tôi là tại sao?
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);
}
}
Vì thử nghiệm của bạn đang làm tệp I/O, có thể bạn đã đạt được điểm với chuỗi thứ 6 mà bạn hiện đang làm quá nhiều I/O và do đó làm chậm mọi thứ xuống. – cmbaxter
Tôi nghĩ rằng đây là một công việc bị ràng buộc IO chứ không phải là một công việc ràng buộc CPU. Thêm nhiều chuỗi chỉ làm cho truy cập đĩa cứng không đều trên đĩa điều hướng giữa nhiều tệp khác nhau (trái với vị trí liên tiếp cho một tệp, được mong đợi trên đĩa được phân mảnh thường xuyên trong hệ điều hành hiện đại). – nhahtdh
Trong loại thử nghiệm này, chỉ số lõi của chúng không có liên quan khi mã của bạn chỉ hoạt động trong bộ nhớ. Khi bạn đã thêm I/O, trong khi một chủ đề đọc một tệp, tất cả những người khác cần phải đợi. –