2013-06-26 60 views

Trả lời

32

loại song song sử dụng luồng. Nó nhanh hơn khi có rất nhiều của các phần tử. Chi phí cho việc song song trở nên nhỏ gọn trên các mảng lớn hơn, nhưng nó lớn đối với các mảng nhỏ hơn.

Hãy nhìn vào bảng này (tất nhiên, kết quả phụ thuộc vào các quá trình CPU, nền, vv):

enter image description here

Taken từ liên kết này: http://www.javacodegeeks.com/2013/04/arrays-sort-versus-arrays-parallelsort.html

+1

Không có thứ gì "quá nhỏ" khi nói về chi phí. Lý tưởng nhất là tôi muốn 0. :) – Trejkaz

+4

Các phép đo thời gian được thực hiện hoàn toàn không chính xác trong thử nghiệm này. Cũng lưu ý rằng nếu mảng đầu vào nhỏ hơn 4096, thì parallelSort chỉ đơn giản gọi các thuật toán sắp xếp tuần tự. Bạn có thực sự tin rằng việc kiểm tra độ dài bổ sung yêu cầu 3 ms cho 602 phần tử không? –

+0

Hey @TagirValeev. Tôi biết câu hỏi này là cũ, nhưng tôi nghĩ rằng tôi sẽ chỉ ra rằng sự khác biệt trong thời gian cho 602 là không có khả năng gây ra bởi việc kiểm tra chiều dài; ít nhất kiểm tra này không phải là đặc biệt để đổ lỗi. Tôi giả sử những lần này không phải là trung bình của nhiều bài kiểm tra, vì vậy có lẽ đây là một quá trình khác đang chạy trên máy tính gây ra sự khác biệt 3ms ở đây. Chỉ cần một số thức ăn để suy nghĩ. Nhưng tôi đồng ý rằng các phép đo được thực hiện không chính xác, vì độ chính xác chỉ đạt được thông qua một số lượng lớn các trường hợp thử nghiệm. Tuy nhiên, có những bài viết khác cho thấy hiệu suất tương tự. – adpro

13

Arrays.parallelSort():

Phương pháp này sử dụng một giá trị ngưỡng và bất kỳ mảng có kích thước nhỏ hơn so với giá trị ngưỡng được sắp xếp bằng cách sử dụng Mảng # sort() API (nghĩa là tuần tự sắp xếp). Và ngưỡng được tính xem xét xử lý song song của máy, kích thước của mảng và được tính như sau:

private static final int getSplitThreshold(int n) { 
int p = ForkJoinPool.getCommonPoolParallelism(); 
int t = (p > 1) ? (1 + n/(p << 3)) : n; 
return t < MIN_ARRAY_SORT_GRAN ? MIN_ARRAY_SORT_GRAN : t; 
} 

Khi quyết định của mình có nên sắp xếp các mảng song song hoặc nối tiếp, nó bây giờ để quyết định làm thế nào để phân chia mảng thành nhiều phần và sau đó gán từng phần cho một nhiệm vụ Fork/Join sẽ xử lý nó và sau đó là một nhiệm vụ Fork/Join khác sẽ xử lý việc sáp nhập các mảng được sắp xếp. Việc triển khai trong JDK 8 sử dụng phương pháp này:

  • Chia mảng thành 4 phần.

  • Sắp xếp hai phần đầu tiên và sau đó hợp nhất chúng.

  • Sắp xếp hai phần tiếp theo và sau đó hợp nhất chúng. Và các bước trên được lặp lại đệ quy với từng phần cho đến khi kích thước của phần cần sắp xếp không nhỏ hơn giá trị ngưỡng được tính ở trên.

Bạn cũng có thể đọc các chi tiết thực hiện trong Javadoc

Các thuật toán sắp xếp là một song song loại hợp nhất mà phá vỡ các mảng thành các mảng mà mình sắp xếp và sau đó sáp nhập. Khi chiều dài mảng phụ đạt đến mức chi tiết tối thiểu, mảng phụ được sắp xếp bằng phương thức Arrays.sort thích hợp. Nếu độ dài của mảng được chỉ định nhỏ hơn mức chi tiết tối thiểu, thì nó được sắp xếp bằng phương thức Arrays.sort thích hợp. Thuật toán yêu cầu một không gian làm việc không lớn hơn kích thước của phạm vi được chỉ định của mảng ban đầu. Hồ bơi chung ForkJoin được sử dụng để thực hiện bất kỳ tác vụ song song nào.

Array.sort():

này sử dụng merge sort HOẶC Tim Sắp xếp bên dưới để sắp xếp các nội dung. Điều này được thực hiện tuần tự, mặc dù sắp xếp hợp nhất sử dụng kỹ thuật phân chia và chinh phục, tất cả được thực hiện tuần tự.

Source

2

Tóm lại, parallelSort sử dụng nhiều chuỗi. Điều này article có cách chi tiết hơn nếu bạn thực sự muốn biết.

2

Từ này link

triển khai phân loại hiện tại được cung cấp bởi Java Collections Framework (Collections.sort và Arrays.sort) tất cả thực hiện sắp xếp tuần tự hoạt động trong tiểu trình đang gọi. Sự tăng cường này sẽ cung cấp cùng một tập hợp các phép toán phân loại hiện đang được cung cấp bởi lớp Mảng, nhưng với việc triển khai song song sử dụng khung công tác Fork/Join . Các API mới này vẫn đồng bộ với quan điểm đến chuỗi cuộc gọi vì nó sẽ không tiếp tục quá trình phân loại cho đến khi sắp xếp song song hoàn tất.

3

Bạn có thể tham khảo the javadoc, điều này giải thích rằng các thuật toán sử dụng một số đề nếu mảng là đủ lớn:

Các thuật toán sắp xếp là một song song loại hợp nhất mà phá vỡ các mảng thành các mảng được sắp xếp và sau đó hợp nhất. Khi độ dài mảng phụ đạt đến mức độ chi tiết tối thiểu, mảng phụ được sắp xếp bằng phương thức thích hợp Arrays.sort. [...] Các ForkJoin chung hồ bơi được sử dụng để thực hiện bất kỳ nhiệm vụ song song.

4

Sự khác biệt chính giữa hai thuật toán như sau:

1. Arrays.sort(): là một phân loại tuần tự.

  • API sử dụng chuỗi đơn cho hoạt động.
  • API mất nhiều thời gian hơn để thực hiện thao tác.

2. Mảng .ParallelSort(): là phân loại song song.

API sử dụng nhiều chuỗi.

  • API mất ít thời gian hơn so với sắp xếp().

Để có thêm kết quả, tất cả chúng ta phải chờ JAVA 8 tôi đoán !! chúc mừng !!

1

Array.sort(myArray);

Bây giờ bạn có thể sử dụng -

Arrays.parallelSort(myArray);

này sẽ tự động chia tay bộ sưu tập mục tiêu thành nhiều phần, mà sẽ được sắp xếp một cách độc lập trên một số lõi và sau đó nhóm lại với nhau . Thông báo trước duy nhất ở đây là khi được gọi trong môi trường đa luồng cao, chẳng hạn như một thùng chứa web bận, lợi ích của phương pháp này sẽ bắt đầu giảm (hơn 90%) do chi phí của các công tắc ngữ cảnh CPU tăng lên.

Nguồn- link

0

Arrays.sort() sử dụng đơn đề để sắp xếp các yếu tố nhưng Arrays.ParallelSort() sẽ sử dụng nhiều chủ đề.
parallelsort sẽ mất ít thời gian hơn khi so sánh với loại bình thường.

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