Tôi đang thử nghiệm với các thuật toán song song trong Java. Tôi bắt đầu với việc sắp xếp hợp nhất và đăng nỗ lực của mình vào số này question. Cố gắng sửa đổi của tôi là trong đoạn code dưới đây, nơi mà bây giờ tôi cố gắng song song sắp xếp nhanh chóng.Java: Song song sắp xếp nhanh qua đa luồng
Có bất kỳ sai lầm tân binh nào trong việc triển khai đa luồng hoặc cách tiếp cận của tôi cho vấn đề này không? Nếu không, tôi không nên mong đợi hơn một tốc độ tăng 32% giữa một tuần tự và một thuật toán song song trên một duel-core (xem timings ở dưới)?
Đây là thuật toán đa luồng:
public class ThreadedQuick extends Thread
{
final int MAX_THREADS = Runtime.getRuntime().availableProcessors();
CountDownLatch doneSignal;
static int num_threads = 1;
int[] my_array;
int start, end;
public ThreadedQuick(CountDownLatch doneSignal, int[] array, int start, int end) {
this.my_array = array;
this.start = start;
this.end = end;
this.doneSignal = doneSignal;
}
public static void reset() {
num_threads = 1;
}
public void run() {
quicksort(my_array, start, end);
doneSignal.countDown();
num_threads--;
}
public void quicksort(int[] array, int start, int end) {
int len = end-start+1;
if (len <= 1)
return;
int pivot_index = medianOfThree(array, start, end);
int pivotValue = array[pivot_index];
swap(array, pivot_index, end);
int storeIndex = start;
for (int i = start; i < end; i++) {
if (array[i] <= pivotValue) {
swap(array, i, storeIndex);
storeIndex++;
}
}
swap(array, storeIndex, end);
if (num_threads < MAX_THREADS) {
num_threads++;
CountDownLatch completionSignal = new CountDownLatch(1);
new ThreadedQuick(completionSignal, array, start, storeIndex - 1).start();
quicksort(array, storeIndex + 1, end);
try {
completionSignal.await(1000, TimeUnit.SECONDS);
} catch(Exception ex) {
ex.printStackTrace();
}
} else {
quicksort(array, start, storeIndex - 1);
quicksort(array, storeIndex + 1, end);
}
}
}
Sau đây là cách tôi bắt đầu nó đi:
ThreadedQuick.reset();
CountDownLatch completionSignal = new CountDownLatch(1);
new ThreadedQuick(completionSignal, array, 0, array.length-1).start();
try {
completionSignal.await(1000, TimeUnit.SECONDS);
} catch(Exception ex){
ex.printStackTrace();
}
Tôi đã thử nghiệm này để chống lại Arrays.sort và tuần tự thuật toán sắp xếp nhanh chóng tương tự. Đây là kết quả thời gian trên một intel đấu-core máy tính xách tay dell, chỉ trong vài giây:
Elements: 500.000, tuần tự: 0,068592, luồng: 0,046871, Arrays.sort: 0,079677
Elements: 1.000.000, tuần tự: 0,14416, luồng: 0,095492, Arrays.sort: 0,167155
Elements: 2.000.000, tuần tự: 0,301666, luồng: 0,205719, Arrays.sort: 0,350982
Elements: 4.000.000, tuần tự: 0,623291, luồng: 0,424119, Arrays.sort: 0,712698
Elements: 8.000.000, tuần tự: 1,279374, luồng: 0,859363, Arrays.sort: 1,487671
Mỗi số ở trên là thời gian trung bình của 100 bài kiểm tra, ném ra 3 trường hợp thấp nhất và 3 trường hợp cao nhất. Tôi đã sử dụng Random.nextInt (Integer.MAX_VALUE) để tạo một mảng cho mỗi bài kiểm tra, được khởi tạo mỗi 10 bài kiểm tra với cùng một hạt giống. Mỗi bài kiểm tra bao gồm thời gian thuật toán đã cho với System.nanoTime. Tôi làm tròn đến sáu chữ số thập phân sau khi lấy trung bình. Và rõ ràng, tôi đã kiểm tra xem từng loại có hoạt động hay không.
Như bạn có thể thấy, tốc độ tăng khoảng 32% giữa các trường hợp tuần tự và luồng trong mỗi bộ kiểm tra. Như tôi đã hỏi ở trên, tôi có nên mong đợi nhiều hơn thế không?
câu hỏi của bạn là gì? –
Bạn đang nói về ngôn ngữ nào? Bạn có muốn biết làm thế nào để sắp xếp trong Java hoặc C# –
Vì vậy, câu hỏi là làm thế nào để thực hiện cú pháp này trong Java và tối ưu hóa các chủ đề làm việc với CPU. –