/*
LWS performance evaluation V.1

this is performance evaluation program for programming user.

functions
1. measurement best time and worst time 
2. total time to performance evaluation
3. error search

made by Lws
*/
import java.io.*;
import java.util.*;


public class  Performance
{
	public static float totalTime;
	public static float bestTime;
	public static float worstTime;
	public static int errorCount;

/***
initial function
*/
	public Performance()
	{
		totalTime=0;
		errorCount=0;
		bestTime=90000;
		worstTime=0;
	}

	public static void MakeResult(String[] args)
	{
		/*
			variable and array
		*/
		String inputFile;
		String outputFile;
		String Message,Message2;
		String Token;
		char[] Sresult;
		BufferedReader in;
		BufferedReader out;
		StringTokenizer st;

		int i,j ;
		long start,stop ;
		long partStart,partStop;
		int row,col;
		int count=0 ;

		char[] result ;
		int testNumber ;
		int[] inMessage ;

		/**********************************
			user class name
		***********************************/
		//userClass [userClassName];
		lws s;
		/*
			input files in array
		*/
		inputFile = args[0] ;
		outputFile = args[1] ;
		start = System.nanoTime() ;

		try
		{
			in = new BufferedReader(new FileReader(inputFile)) ;
			out = new BufferedReader(new FileReader(outputFile)) ;

			Message = in.readLine() ;
			Message2 = out.readLine();
			st = new StringTokenizer(Message) ;
			Token = st.nextToken() ;
			testNumber = Integer.valueOf(Token).intValue() ;
			
			while (true)
			{
				s = new lws();
				inMessage = new int[testNumber] ;
				result = new char[10] ;
				Sresult = new char[10];

				for(i=0;i<testNumber;i++)
				{
					Token = st.nextToken() ;
					inMessage[i] = Integer.valueOf(Token).intValue() ;
				}

				partStart = System.nanoTime() ;
				result = s.unsResult(testNumber,inMessage) ;
				partStop = System.nanoTime() ;
				for(i=0;i<result.length;i++)
				{
					if(result[i] != Message2.charAt(i)) break;
				}
				if(i!=result.length)
					errorCount++;

				if(bestTime > (partStop-partStart))
					bestTime = partStop-partStart ;
				if(worstTime <(partStop-partStart))
					worstTime = partStop-partStart ;

				Message = in.readLine() ;
				Message = in.readLine() ;
				Message2 = out.readLine() ;
				st = new StringTokenizer(Message) ;
				Token = st.nextToken() ;
				testNumber = Integer.valueOf(Token).intValue() ;
				
				count++;
				if(testNumber == 0) break ;
			}
			in.close() ;
			stop = System.nanoTime() ;
			System.out.println((float)((float)(stop-start)/1000000) + "ms") ;
			totalTime += (float)(stop-start)/1000000 ;
		}
		catch (IOException e)
		{
			System.out.println("UNS : inputFile error - "+inputFile) ;
			System.exit(0) ;
		}
	}

	public static void main(String[] args) 
	{
		int i ;
		if(args.length != 2) {
			System.out.println("Usage : Input Ouput");
			System.exit(0) ;
		}
		// number of testing
		
		MakeResult(args);
		MakeResult(args);
		MakeResult(args);
		MakeResult(args);
		MakeResult(args);
		MakeResult(args);
		MakeResult(args);
		MakeResult(args);
		MakeResult(args);
		MakeResult(args);

		System.out.print("Average measurement Time :");
		System.out.format("%.3f ms%n",(float)(totalTime/10));
		System.out.format("Best Time  : %.3f ms%n",(float)(bestTime)/1000000);
		System.out.format("Worst Time : %.3f ms%n",(float)(worstTime)/10000000);
		System.out.println("error count : "+errorCount) ;
	}
}

