2015-02-16 5 views
0

Я использую многопоточную функцию быстрой сортировки Java из библиотеки cern.colt.ParallelQuickSort (http://incanter.org/docs/parallelcolt/api/cern/colt/ParallelQuickSort.html и https://github.com/Danimoth/Parallel-Colt/blob/master/src/cern/colt/ParallelQuickSort.java). Я хочу проверить, сколько времени уходит при выборе различного количества потоков. Я использую System.nanoTime(), чтобы отслеживать время выполнения. Однако, даже когда количество потоков, которые я выбираю, и несортированный массив одинаковы для нескольких прогонов, время выполнения совершенно иное. Я думаю, это связано с тем, что quicksort(), предоставленная в библиотеке cern.colt.ParallelQuickSort, не ждет завершения потоков. Я хотел бы знать, как я могу написать код, чтобы ждать завершения всех потоков, чтобы я мог измерять время выполнения вне функции, предоставленной библиотекой? Что-то вроде ниже :?wait for all threads complete in Java

ParallelQuickSort qs=new ParallelQuickSort(); 
long startTime = System.nanoTime(); 
qs.quickSort(unsorted_array, 0, array_size, comp, number_threads); 

//java code to wait for all threads to complete 

long time_elapse= System.nanoTime() - startTime; 

Edit: Ниже мой код: Первоначально мой код для запуска быстрой сортировки с числом нитей от 1 до 15 для размера массива 2^10, 2^15, 2^20, 2^25 и 2^28, и для каждого случая я запускаю 30 раз. Чтобы отлаживать, я изменил свой код, чтобы выполнить только размер массива = 2^10 с использованием 1 потока и запустить его в 10 раз.

import cern.colt.ParallelQuickSort; 
import cern.colt.function.tint.IntComparator; 
import cern.colt.Timer; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.lang.System.*; 
import java.util.*; 


public class quick_sort { 

    static void readData(int dst[], int nitems, int num) throws IOException{ 
     String s="mydata"+Integer.toString(num)+".txt"; 
     //System.out.println(s); 
     Scanner scanner = new Scanner(new File(s)); 
     int i = 0; 
     while(scanner.hasNextInt()) 
     { 
      dst[i++] = scanner.nextInt(); 
     } 

    } 



public static void main(String [ ] args) throws IOException 
{ 

    //for(int i=0; i<n;i++) dst[i]=n-i; 


    /* 
    System.out.println("Unsorted: "); 
    for(int i=0; i<n; i++) System.out.print(dst[i]+" "); 
    System.out.println(" "); 
    */ 

    IntComparator comp=new IntComparator(){ 
     public int compare(int a, int b){ 
      if(a>b) return 1; 
      else if(a<b) return -1; 
      else return 0; 
     } 
     }; 




    int iter=10; 
    int thread_num=1; 
    //FileWriter fw = new FileWriter("out.txt"); 

    int num[]={10, 15, 20, 25, 28}; 
for(int m=0; m<1; m++){   
    for(int k=1; k<=thread_num; k++){ 
    long estimatedTime=0; 
    for(int i=0; i<iter; i++){ 
     int n=1<<num[m]; 
     int dst[]=new int[n]; 
     readData(dst, n, num[m]); 

     ParallelQuickSort qs=new ParallelQuickSort(); 

     long startTime = System.nanoTime(); 

     qs.quickSort(dst, 0, n, comp, k); 

     long temp= System.nanoTime() - startTime; 
     estimatedTime+=temp; 



     System.out.println("Time="+temp*0.000001); 

    } 
    System.out.println(num[m]+"Wall Clock Time when thread number="+k+": "+estimatedTime/iter*0.000001); 
    //fw.write(num[m]+"Wall Clock Time when thread number="+k+": "+estimatedTime/iter*0.000001+'\n'); 
} 


    //System.out.println("Sorted: "); 
    //for(int i=0; i<n; i++) System.out.print(dst[i]+" "); 
    //System.out.println(" "); 




} 
//fw.close(); 
System.out.println("Finish!"); 

} 

}

Результат показан ниже:

Time=0.755289 
Time=0.632124 
Time=0.502016 
Time=0.502922 
Time=0.100524 
Time=0.076072 
Time=0.073657 
Time=0.073355 
Time=0.074261 
Time=0.076374 
10Wall Clock Time when thread number=1: 0.286659 
Finish! 
+0

http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join%28%29 - Надеюсь, это полезно. – BatScream

+0

У меня нет способа получить потоки, созданные в этой функции, как я могу использовать join? – weidan

+1

Используйте CountDownLatch. –

ответ

1

Функция ParallelQuickSort.quicksort возвращает только один раз все нити/суб операции завершены. Вам не нужно вручную ждать завершения всех потоков.

Это можно подтвердить, просмотрев код (ищите other.get()) и что это единственное разумное поведение.

РЕДАКТИРОВАТЬ: Характеристики тестирования могут быть обманчиво твердыми, см. Java Performance Testing и многие другие места для деталей.

+0

Тогда почему при тех же условиях (то же самое несортированный массив, такое же количество потоков) работает несколько раз, например, 30 раз. Я получил время выполнения имеет большую разницу? – weidan

+0

@weidan Это может быть ряд факторов, возможно, другие процессы, запущенные на вашем компьютере. Я обновил свой ответ. Попробуйте использовать более крупный массив/больше итераций или отправьте свой тестовый код, если вы хотите получить более точные ответы. –