package demo.benchmark;

import java.io.*;
import org.omg.CosNaming.*;

/**
 * A simple benchmark for remote invocations.
 * It takes the system clock right before and after 
 * method invocations. Originally adopted
 * from code by Christophe Warland
 */

public class Client 
{

    public static void main(String args[]) 
    {
	org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
	bench server = null;

	try 
	{
	    if( args.length > 0  )
	    {
                try 
                {
                    File f = new File( args[0] );
                    BufferedReader br = new BufferedReader( new FileReader( f ));
                    String ior = br.readLine();
                    br.close();
                    server = benchHelper.narrow(orb.string_to_object(ior));
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                    System.exit( 1 );
                }

	    }
	    else
	    {
		NamingContextExt nc = NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));
		server = benchHelper.narrow(nc.resolve(nc.to_name("benchmark")));
	    }

	    System.out.print("     Ping                       [1]\n"
			     +"     Transfer array of int      [2]\n"
			     +"     Transfer array of byte     [3]\n"
			     +"     Transfer array of struct   [4]\n"
			     +"     Transfer array of string   [5]\n"
			     +"                                   \n"
			     +"     Auto mode     - Long! -    [auto]\n"
			     +"     EXIT                       [0]\n"
			     +"     --------------------------------\n"
			     +"         Your choice :          ");

	    DataInput d = new DataInputStream(System.in);
	    String line;
	
	    while ((line = d.readLine()) != null) 
	    {
		if ( line.equals("1") )
		{
		    System.out.print("     Number of loops : ");
		    int loop = new Integer(d.readLine()).intValue();
		    int nb = loop;
		    long startTime = 0;
		    long stopTime = 0;

		    startTime = System.currentTimeMillis();
		    while (nb-- > 0)
			server.ping();

		    stopTime = System.currentTimeMillis();

		    System.out.println(">>> Elapsed time = " 
				       + (stopTime - startTime)/1000 
				       + " secs      avg time = (" 
				       + ( (stopTime - startTime)/ (float)loop) 
				       + ") msecs");
		    
		} 
		else if ( line.equals("2") ) 
		{
		    System.out.print("     Number of loops : ");
		    int loop = new Integer(d.readLine()).intValue(); 
		    int nb = loop;
		    System.out.print("     Size of array : ");
		    int size = new Integer(d.readLine()).intValue(); 
		    int myInt[] = new int[size];
		    for( int si = 0; si < size; si++)
		    {
			myInt[si]=si;
		    }

		    int ret_vals[] = null;
					
		    long startTime = System.currentTimeMillis();
		    while (nb-- > 0)
			ret_vals = server.intTransfer(myInt);

		    // for(int i = 0; i < size; System.out.print(" " + ret_vals[i++]));

		    long stopTime = System.currentTimeMillis();
		    System.out.println(">>> Elapsed time = " 
				       + (stopTime - startTime)/1000 
				       + " secs      Average time = "
				       +  ((stopTime - startTime) / (float)loop) 
				       + " msecs");
					
		} 
		else if ( line.equals("3") ) 
		{
                    // byte arrays 

		    System.out.print("     Number of loops : ");
		    int loop = new Integer(d.readLine()).intValue();
		    int nb = loop;
		    System.out.print("     Size of array : ");
		    int size = new Integer(d.readLine()).intValue(); 
		    byte mybytes[] = new byte[size];
		
		    long startTime = System.currentTimeMillis();
		    while (nb-- > 0)
			server.octetTransfer(mybytes);

		    long stopTime = System.currentTimeMillis();
		    System.out.println(">>> Elapsed time = " 
				       + (stopTime - startTime)/1000 
				       + " secs      Average time = "
				       +  ((stopTime - startTime) / (float)loop) 
				       + " msecs");
		    
		} 
		else if ( line.equals("4") ) 
		{
                    // struct arrays 

		    System.out.print("     Number of loops : ");
		    int loop = new Integer(d.readLine()).intValue();
		    int nb = loop;
		    System.out.print("     Array Size : ");
		    int size = new Integer(d.readLine()).intValue(); 
		    Struct myStruct[] = new Struct[size];

		    for( int si = 0; si < size; si++)
			myStruct[si]= new Struct();
		
		    long startTime = System.currentTimeMillis();
		    while (nb-- > 0)
			server.structTransfer(myStruct);

		    long stopTime = System.currentTimeMillis();
		    System.out.println(">>> Elapsed time = " 
				       + (stopTime - startTime)/1000 
				       + " secs      Average time = "
				       +  ((stopTime - startTime) / (float)loop) 
				       + " msecs");
		    
		} 
		else if ( line.equals("5") ) 
		{
                    // string arrays 

		    System.out.print("     Number of loops : ");
		    int loop = new Integer(d.readLine()).intValue();
		    int nb = loop;
		    System.out.print("     Array size: ");
		    int size = new Integer(d.readLine()).intValue(); 
		    String myString[] = new String[size];

		    for( int si = 0; si < size; si++)
			myString[si]= "testString";
		
		    long startTime = System.currentTimeMillis();
		    while (nb-- > 0)
			server.stringTransfer(myString);

		    long stopTime = System.currentTimeMillis();
		    System.out.println(">>> Elapsed time = " 
				       + (stopTime - startTime)/1000 
				       + " secs      Average time = "
				       +  ((stopTime - startTime) / (float)loop) 
				       + " msecs");
		    
		} 
		else if ( line.equals("auto")) 
		{
		    System.out.println("#### Entering auto-mode ####");
		    System.out.print("     Number of loops : ");
		    int loop = new Integer(d.readLine()).intValue();
		    int size = 1;
		    System.out.println("\n Results are average times in msecs for "
				       + loop+ " round trips\n");
		    System.out.println("  Array size     Ping    int[]  byte[]  struct[]   string[]");
		    System.out.println(" ============= ======== ====== ======= ========== =========");

		    for (int i = 0; i < 6; i++ ) 
		    {
			System.out.print("\t"+size);
			int myInt[] = new int[size];
			byte myByte[] = new byte[size];
			Struct myStruct[] = new Struct[size];
			String myString[] = new String[size];
			for( int si = 0; si < size; si++)
			{
			    myStruct[si]= new Struct();
			    myInt[si]=si;
                            myString[si]= "testString";
			}

			long startTime = System.currentTimeMillis();

			int nb = loop;
			while (nb-- > 0)
			    server.ping();

			long stopTime = System.currentTimeMillis();
			System.out.print("\t"+((stopTime - startTime) / (float)loop));
			startTime = System.currentTimeMillis();

			nb = loop;
			while (nb-- > 0)
			    server.intTransfer(myInt);

			stopTime = System.currentTimeMillis();
			System.out.print("\t"+((stopTime - startTime) / (float)loop));

			startTime = System.currentTimeMillis();
			nb = loop;
			while (nb-- > 0)
			    server.octetTransfer( myByte );
			stopTime = System.currentTimeMillis();
			System.out.print("\t"+((stopTime - startTime) / (float)loop));

			startTime = System.currentTimeMillis();
			nb = loop;
			while (nb-- > 0)
			    server.structTransfer(myStruct);
			stopTime = System.currentTimeMillis();
			System.out.print("\t"+((stopTime - startTime) / (float)loop));

			startTime = System.currentTimeMillis();
			nb = loop;
			while (nb-- > 0)
			    server.stringTransfer(myString);
			stopTime = System.currentTimeMillis();
			System.out.print("\t"+((stopTime - startTime) / (float)loop));

                        System.out.println();
			size = size*10;
		    }
		    System.out.println("\n#### Exiting auto-mode ####\n");
		} 
		else if ( line.equals("0") ) 
		{
		    System.out.println("\nExiting ...");
		    orb.shutdown( true );
		    return;
		    //System.exit(0);
		}
		System.out.print("     Ping [1]   Array of int [2]  Array of byte [3] "
				 +"Array of struct [4] : ");
			 
	    } // while
	} 
	catch (Exception e) 
	{
	    System.out.println("### Exception !!! ### \n");
	    e.printStackTrace();
	}
	orb.shutdown( true );
	// System.exit(0);
    }
}


