/*
 * QuicksortDemo.java -- run and measure execution time of Quicksort. 
 */

class QuickSortDemo {
    public static void main(String argv[]) 
	throws java.lang.InterruptedException
    {
	if( argv.length != 2 )
        {
	    System.err.println("Usage:% java QuicksortDemo matrix-size nthreads");
	    System.err.println("Hints: matrix-size: 1000000, nthreads: 1..nCPU");
	    System.exit( 1 );
	}
	int matrix_size = Integer.parseInt( argv[0] );
	int nthreads    = Integer.parseInt( argv[1] );
	run_quicksort( matrix_size, nthreads );
	System.exit( 0 );
    }
    static void run_quicksort( int matrix_size, int nthreads )
	throws java.lang.InterruptedException
    {
	// pthread_setconcurrency( nthreads );
	double data[] = new double[matrix_size];
	data_fill( data,matrix_size );
	long start = System.currentTimeMillis();
	    QuickSort qs = new QuickSort( nthreads );
	    qs.add_task( data,0,matrix_size );
	    qs.work_wait();
	long end = System.currentTimeMillis();
	double diff = (double)(end - start)/1000.0 ;
	int concurrency = 0; // pthread_getconcurrency();
	int niters = 1;
	System.out.printf("matrix_size==%d, nthreads==%d, niters==%d, concurrency==%d\n",
	       matrix_size, nthreads, niters, concurrency );
	System.out.printf("%6.3f [sec] / %d [iteration] == %6.3f [sec/iteration]\n",
	       diff, niters, diff/niters );
	System.out.printf("%d [iteration] / %6.3f [sec] == %6.3f [iteration/sec]\n",
	       	niters, diff, niters/diff );
    }
    static void data_fill( double data[], int size )
    {
	int i;
	java.util.Random r = new java.util.Random();
	for( i=0 ; i<size; i++ )
	{
	    data[i] = r.nextDouble();
	}
    }
    static void data_print( double data[], int size )
    {
	int i;
	for( i=0 ; i<size; i++ )
	{
	    System.out.printf("%4.2f ",data[i]);
	}
	System.out.printf("\n");
    }
}
