
#include "stdio.h"
#include "petsc.h"
#include "sys.h"

int main( int argc, char **argv)
{
  double    t1, t2, value;
  int       i, ierr,z[10000], intval, tmp;
  Scalar    *x, *y;
  SYRandom  r;

  PetscInitialize(&argc, &argv,0,0,0);
  ierr = SYRandomCreate(MPI_COMM_SELF,RANDOM_DEFAULT,&r); CHKERRQ(ierr);
  x    = (Scalar *)PetscMalloc(10000*sizeof(Scalar)); CHKPTRA(x);
  y    = (Scalar *)PetscMalloc(10000*sizeof(Scalar)); CHKPTRA(y);

  /* Take care of paging effects */
  t1 = PetscGetTime(); 
  
  for (i=0; i<10000; i++) {
    /*    x[i] = i;
    y[i] = i; */
    z[i] = i;
  }
 
  /* Form the random set of integers */
  for (i=0; i<10000; i++) {
    ierr   = SYRandomGetValue(r, &value); CHKERRQ(ierr);
    intval = (int)(value*10000.0);
    tmp    = z[i];
    z[i]   = z[intval];
    z[intval] = tmp;
  }


  t1 = PetscGetTime(); 
  for (i=0; i<1000; i++) {  x[i] = y[z[i]]; }
  t2 = PetscGetTime(); 
  fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/1000.0);


  t1 = PetscGetTime(); 
  for (i=0; i<1000; i++) {  x[z[i]] = y[i]; }
  t2 = PetscGetTime(); 
  fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/1000.0);

  t1 = PetscGetTime(); 
  for (i=0; i<1000; i++) {  x[z[i]] = y[z[i]]; }
  t2 = PetscGetTime(); 
  fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[z[i]]",(t2-t1)/1000.0);

  PetscFinalize();
  return 0;
}
