/** * Created by Xan Gregg. * Date: Jan 12, 2006 */ public class TestRangeCheck { public static final int M = 5000; public static final int N = 10000; public static void main(String[] args) { for (int i = 0; i < 5; i++) { time(new Easy()); time(new Medium()); time(new Hard()); time(new HardWithHint()); System.out.println(); } } private static void time(Worker w) { long start = System.currentTimeMillis(); double result = w.work(); long end = System.currentTimeMillis(); long elapsed = end - start; System.out.println(w.getClass().getName() + " result = " + result + "; elapsed = " + elapsed); } interface Worker { double work(); } static class Easy implements Worker { double data[] = new double[N]; public double work() { for (int i = 0; i < N; i++) { int j = i; // same as i int k = i / 2 + (i + 1) / 2; // same as i data[i] = j - k; } double sum = 0; for (int m = 0; m < M; m++) { for (int i = 0; i < N; i++) { int j = i; // same as i int k = i / 2 + (i + 1) / 2; // same as i data[i] += 1.0 / ((m * N + j) * 2 + 1) * -((k % 2) * 2 - 1); } for (int i = 0; i < N; i++) { int j = i; // same as i int k = i / 2 + (i + 1) / 2; // same as i sum += data[i] + k - j; } } return sum * 4 / M; } } static class Medium implements Worker { double data[] = new double[N]; public double work() { for (int i = 0; i < N; i++) { int j = i; // same as i int k = i / 2 + (i + 1) / 2; // same as i data[j] = j - k; } double sum = 0; for (int m = 0; m < M; m++) { for (int i = 0; i < N; i++) { int j = i; // same as i int k = i / 2 + (i + 1) / 2; // same as i data[j] += 1.0 / ((m * N + j) * 2 + 1) * -((k % 2) * 2 - 1); } for (int i = 0; i < N; i++) { int j = i; // same as i int k = i / 2 + (i + 1) / 2; // same as i sum += data[j] + k - j; } } return sum * 4 / M; } } static class Hard implements Worker { double data[] = new double[N]; public double work() { for (int i = 0; i < N; i++) { int j = i; // same as i int k = i / 2 + (i + 1) / 2; // same as i data[k] = j - k; } double sum = 0; for (int m = 0; m < M; m++) { for (int i = 0; i < N; i++) { int j = i; // same as i int k = i / 2 + (i + 1) / 2; // same as i data[k] += 1.0 / ((m * N + j) * 2 + 1) * -((k % 2) * 2 - 1); } for (int i = 0; i < N; i++) { int j = i; // same as i int k = i / 2 + (i + 1) / 2; // same as i sum += data[k] + k - j; } } return sum * 4 / M; } } static class HardWithHint implements Worker { double data[] = new double[N]; public double work() { for (int i = 0; i < N; i++) { int j = i; // same as i int k = i / 2 + (i + 1) / 2; // same as i if (k >= 0 && k < data.length) data[k] = j - k; } double sum = 0; for (int m = 0; m < M; m++) { for (int i = 0; i < N; i++) { int j = i; // same as i int k = i / 2 + (i + 1) / 2; // same as i if (k >= 0 && k < data.length) data[k] += 1.0 / ((m * N + j) * 2 + 1) * -((k % 2) * 2 - 1); } for (int i = 0; i < N; i++) { int j = i; // same as i int k = i / 2 + (i + 1) / 2; // same as i if (k >= 0 && k < data.length) sum += data[k] + k - j; } } return sum * 4 / M; } } }