package ch.cern.colt.test;

/**
 * Benchmarks array copies with System.arraycopy(...) versus loops with a[i] = b[i].
 */
public class ArrayCopyBenchmark {
/**
 * This method was created in VisualAge.
 */
public static void benchmarkCopy(int size, int tests) {
	ch.cern.it.util.Timer timer = new ch.cern.it.util.Timer();

	int byteSize = 1;
	int intSize = 4;
	int longSize = 8;
	int elementSize;

	{
		System.out.println("\n\n\nbenchmarkking byte copy...");
		elementSize = byteSize;		

		byte[] source = new byte[size];
		byte[] dest = new byte[size];

		System.out.println("\narraycopy()...");	
		timer.reset().start();
		for (int i=tests; --i >=0; ) {
			System.arraycopy(source,0,dest,0,size);
		}
		timer.stop().display();
		System.out.println("--> "+(int) (size*tests/timer.elapsedTime())+" elements/sec.");
		System.out.println("--> "+(int) (size*tests*elementSize/timer.elapsedTime()/1024/1024)+" MB/sec.");
		
		System.out.println("\nn[] copy...");
		timer.reset().start();
		for (int i=tests; --i >=0; ) {
			for (int j=size; --j >=0; ) {
				dest[j] = source[j];
			}
		}
		timer.stop().display();
		System.out.println("--> "+(int) (size*tests/timer.elapsedTime())+" elements/sec.");
		System.out.println("--> "+(int) (size*tests*elementSize/timer.elapsedTime()/1024/1024)+" MB/sec.");
	}
	
	{
		System.out.println("\n\n\nbenchmarkking int copy...");	
		elementSize = intSize;		

		int[] source = new int[size];
		int[] dest = new int[size];

		System.out.println("\narraycopy()...");	
		timer.reset().start();
		for (int i=tests; --i >=0; ) {
			System.arraycopy(source,0,dest,0,size);
		}
		timer.stop().display();
		System.out.println("--> "+(int) (size*tests/timer.elapsedTime())+" elements/sec.");
		System.out.println("--> "+(int) (size*tests*elementSize/timer.elapsedTime()/1024/1024)+" MB/sec.");
		
		System.out.println("\nn[] copy...");
		timer.reset().start();
		for (int i=tests; --i >=0; ) {
			for (int j=size; --j >=0; ) {
				dest[j] = source[j];
			}
		}
		timer.stop().display();
		System.out.println("--> "+(int) (size*tests/timer.elapsedTime())+" elements/sec.");
		System.out.println("--> "+(int) (size*tests*elementSize/timer.elapsedTime()/1024/1024)+" MB/sec.");
	}
	
	{
		System.out.println("\n\n\nbenchmarkking long copy...");	
		elementSize =longSize;		

		long[] source = new long[size];
		long[] dest = new long[size];

		System.out.println("\narraycopy()...");	
		timer.reset().start();
		for (int i=tests; --i >=0; ) {
			System.arraycopy(source,0,dest,0,size);
		}
		timer.stop().display();
		System.out.println("--> "+(int) (size*tests/timer.elapsedTime())+" elements/sec.");
		System.out.println("--> "+(int) (size*tests*elementSize/timer.elapsedTime()/1024/1024)+" MB/sec.");
		
		System.out.println("\nn[] copy...");
		timer.reset().start();
		for (int i=tests; --i >=0; ) {
			for (int j=size; --j >=0; ) {
				dest[j] = source[j];
			}
		}
		timer.stop().display();
		System.out.println("--> "+(int) (size*tests/timer.elapsedTime())+" elements/sec.");
		System.out.println("--> "+(int) (size*tests*elementSize/timer.elapsedTime()/1024/1024)+" MB/sec.");
	}
	
	System.out.println("\nfinish\n");
}
/**
 * Not yet commented.
 * @param args java.lang.String[]
 */
public static void main(String args[]) {
	int tests = Integer.parseInt(args[0]);
	int size = Integer.parseInt(args[1]);

	benchmarkCopy(size, tests);
}
}