public class ArrayCopyTest { static final int N = 100000; static void test(byte a1[], byte a2[], int from[], int to[], int iter, int start, int limit, int step) { int res = 0; for (int size = start; size <= limit; size += step) { long begin_time = System.currentTimeMillis(); for (int j = 0; j < iter; j++) { for (int k = 1; k < N; k++) { System.arraycopy(a1, to[k], a2, from[k], size); res += a1[size]; } } long end_time = System.currentTimeMillis(); System.out.println("'" + size + "," + (end_time-begin_time)); } System.out.println("result = " + res); } public static void main (String[] args) { final int ARRSIZE = 128 * 1024; byte arr1[] = new byte[ARRSIZE * 2]; byte arr2[] = new byte[ARRSIZE * 2]; int from[] = new int[N]; int to[] = new int[N]; int f1 = 1, f2 = 1; for (int i = 0; i < ARRSIZE * 2; i++) { int n = f1 + f2; arr1[i] = (byte)n; arr2[i] = (byte)f1; f1 = f2; f2 = n; } java.util.Random gen = new java.util.Random(1L); for (int i = 0; i < N; i++) { from[i] = (int)(gen.nextDouble() * (double)ARRSIZE); } for (int i = 0; i < N; i++) { to[i] = (int)(gen.nextDouble() * (double)ARRSIZE); } int iter = Integer.parseInt(args[0]); int start = Integer.parseInt(args[1]); int end = Integer.parseInt(args[2]); int step = Integer.parseInt(args[3]); System.out.println("Warmup"); test(arr1, arr2, from, to, 10, 0, 1000, 100); test(arr2, arr1, from, to, 10, 0, 1000, 100); System.out.println("Testing copies from size = " + start + " to " + end + ", step = " + step); System.out.println("========================================================="); test(arr1, arr2, from, to, iter, start, end, step); System.out.println("Testing reverse copies from size = " + start + " to " + end + ", step = " + step); test(arr2, arr1, from, to, iter, start, end, step); System.out.println("========================================================="); } }