2015-05-05 25 views
5

Tôi đã đoạn mã sau,Arrays.sort và Arrays.parallelSort chức năng hành vi

import java.util.Arrays; 


public class ParellelStream { 

    public static void main(String args[]){ 
     Double dbl[] = new Double[1000000]; 
     for(int i=0; i<dbl.length;i++){ 
      dbl[i]=Math.random(); 
     } 

     long start = System.currentTimeMillis(); 
     Arrays.parallelSort(dbl); 
     System.out.println("time taken :"+((System.currentTimeMillis())-start)); 

    } 

} 

Khi tôi chạy mã này phải mất thời gian khoảng 700-800 ms, nhưng khi tôi thay thế dòng Arrays.parallelSort để mảng .sort phải mất 500 đến 600 ms. Tôi đã đọc về phương thức Arrays.parallelSort và Arrays.sort mà nói rằng Arrays.parellelSort cho hiệu suất kém khi tập dữ liệu nhỏ nhưng ở đây tôi đang sử dụng mảng của 1000000 phần tử. những gì có thể là lý do cho hiệu suất kém parallelSort ?? Tôi đang sử dụng java8.

+0

Các bạn đã thử đặt các loại theo thời gian trong một vòng lặp và làm nó nhiều lần trong một invocation? Khởi động các luồng làm phép phân loại song song có một đầu vào, nhưng chúng sẽ được tái sử dụng trong suốt thời gian tồn tại của chương trình. Vì vậy, đối với thử nghiệm trong thế giới thực (trừ khi trường hợp sử dụng của bạn thực sự là một chương trình một lần), bạn nên lặp lại việc phân loại thường xuyên để phân bổ chi phí. –

+2

Có bao nhiêu lõi xử lý trên máy thử nghiệm của bạn? Nó tương đối yên tĩnh với chỉ chạy thử nghiệm của bạn? –

+0

Có, tôi đã thử theo cách đó cũng như @SebastianRedl –

Trả lời

4

tôi đọc về Arrays.parallelSort và Arrays.sort phương pháp mà nói rằng Arrays.parellelSort cho hiệu suất kém khi tập dữ liệu nhỏ nhưng ở đây tôi đang sử dụng hàng loạt các yếu tố 1000000.

Đây không phải là điều duy nhất cần xem xét. Nó phụ thuộc rất nhiều vào máy tính của bạn (cách CPU của bạn xử lý đa luồng vv).

Dưới đây là một trích dẫn từ phần song song của Java Tutorials

Lưu ý rằng song song không phải là tự động nhanh hơn so với thực hiện hoạt động nối tiếp, mặc dù nó có thể được nếu bạn có đủ dữ liệu và nhân xử lý [ ...] bạn vẫn phải chịu trách nhiệm xác định xem đơn đăng ký của bạn có phù hợp với tính song song hay không.

Bạn cũng có thể muốn xem mã số java.util.ArraysParallelSortHelpers để hiểu rõ hơn về thuật toán.

Lưu ý rằng phương pháp parallelSort sử dụng ForkJoinPool giới thiệu trong Java 7 để tận dụng của mỗi bộ vi xử lý của máy tính của bạn như đã nêu trong javadoc:

Một ForkJoinPool được xây dựng với mức mục tiêu song song nhất định; theo mặc định, bằng số lượng bộ xử lý có sẵn.

Lưu ý rằng nếu độ dài của mảng nhỏ hơn 1 << 13, mảng sẽ được sắp xếp theo phương pháp thích hợp Arrays.sort.

Xem thêm

5

Hàm song song sẽ sử dụng một chuỗi cho mỗi lõi cpu bạn có trên máy của mình. Cụ thể parallelSort chạy các nhiệm vụ trên nhóm Thread thread chung của ForkJoin. Nếu bạn chỉ có một lõi, bạn sẽ không thấy một sự cải tiến so với loại luồng đơn.

Nếu bạn chỉ có nhiều lõi, bạn sẽ có một số chi phí trả trước liên quan đến việc tạo chuỗi mới có nghĩa là đối với mảng tương đối nhỏ, bạn sẽ không thấy được hiệu suất tuyến tính.

Chức năng so sánh để so sánh gấp đôi không phải là hàm đắt tiền. Tôi nghĩ rằng trong trường hợp này, 1000000 yếu tố có thể được xem xét một cách an toàn nhỏ và lợi ích của việc sử dụng nhiều chủ đề là lớn hơn bởi các chi phí trả trước của việc tạo ra những chủ đề đó. Vì chi phí trả trước sẽ được sửa, bạn sẽ thấy hiệu suất đạt được với các mảng lớn hơn.

+0

Tôi có bộ xử lý lõi tứ trên máy thử nghiệm. –

+0

Thử thêm 100x yếu tố trong mảng của bạn. Vì chi phí trả trước sẽ được cố định. Bạn sẽ thấy hiệu suất đạt được với các mảng lớn hơn. – bhspencer

+2

Cũng cho điểm chuẩn, tôi khuyên bạn nên sử dụng System.nanoTime() thay vì System.currentTimeMillis() như currentTimeMillis không có độ chính xác millisecond trên hầu hết các máy. – bhspencer

Các vấn đề liên quan