public class DeadCode1 {
    final private static long NANOS_PER_MS = 1000000L;
    final private static int NUMBER = 25;
    // Nierekursywny kalkulator Fibonacciego
    private static int calcFibonacci(int n) {
        int result = 1;
        int prev = -1;
        int sum = 0;
        for (int i = 0; i <= n; i++) {
            sum = prev + result;
            prev = result;
            result = sum;
        }
        return result;
    }
    private static void doTest(long iterations) {
        long startTime = System.nanoTime();
        for (long i = 0; i < iterations; i++)
            calcFibonacci(NUMBER);
        long elapsedTime = System.nanoTime() - startTime;
        System.out.println("    Czas, ktry upyn w nanosekundach -> " +
                            elapsedTime);
        float millis = elapsedTime / NANOS_PER_MS;
        float itrsPerMs = 0;
        if (millis != 0)
            itrsPerMs = iterations/millis;
        System.out.println("    Liczba iteracji na ms ---> " +
                            itrsPerMs);
    }
    public static void main(String[] args) {
        System.out.println("Rozpoczynanie rozgrzewki ...");
        doTest(1000000L);
        System.out.println("Rozgrzewka zakoczona.");
        System.out.println("Rozpoczcie interwau pomiarowego ...");
        doTest(900000000L);
        System.out.println("Zakoczenie interwau pomiarowego.");
        System.out.println("Zakoczenie testu.");
    }
}
--------------------------------------------------------------------------------------------------------------------------------------
public class DeadCode2 {
    final private static long NANOS_PER_MS = 1000000L;
    final private static int NUMBER = 25;
    private static int calcFibonacci(int n) {
        int result = 1;
        int prev = -1;
        int sum = 0;
        for (int i = 0; i <= n; i++) {
            sum = prev + result;
            prev = result;
            result = sum;
        }
        return result;
    }
    private static void doTest(long iterations) {
        int answer = 0;
        long startTime = System.nanoTime();
        for (long i = 0; i < iterations; i++)
            answer = calcFibonacci(NUMBER);
        long elapsedTime = System.nanoTime() - startTime;
        System.out.println("    Odpowied -> " + answer);
        System.out.println("    Czas, ktry upyn w nanosekundach -> " +
                            elapsedTime);
        float millis = elapsedTime / NANOS_PER_MS;
        float itrsPerMs = 0;
        if (millis != 0)
            itrsPerMs = iterations/millis;
        System.out.println("    Liczba iteracji na ms ---> " +
                            itrsPerMs);
    }
    public static void main(String[] args) {
        System.out.println("Rozpoczynanie rozgrzewki ...");
        doTest(1000000L);
        System.out.println("Rozgrzewka zakoczona.");
        System.out.println("Rozpoczynanie interwau pomiarowego ...");
        doTest(900000000L);
        System.out.println("Zakoczenie interwau pomiarowego.");
        System.out.println("Test zakoczony.");
    }
}
--------------------------------------------------------------------------------------------------------------------------------------
public class DeadCode3 {
    final private static long NANOS_PER_MS = 1000000L;
    final private static int NUMBER = 25;
    private static int calcFibonacci(int n) {
        int result = 1;
        int prev = -1;
        int sum = 0;
        for (int i = 0; i <= n; i++) {
            sum = prev + result;
            prev = result;
            result = sum;
        }
        return result;
    }
    private static void doTest(long iterations) {
        int answer = 0;
        long startTime = System.nanoTime();
        for (long i = 0; i < iterations; i++)
            answer = calcFibonacci(NUMBER);
        long elapsedTime = System.nanoTime() - startTime;
        System.out.println("    Odpowied -> " + answer);
        System.out.println("    Czas, ktry upyn w nanosekundach -> " +
                            elapsedTime);
        float millis = elapsedTime / NANOS_PER_MS;
        float itrsPerMs = 0;
        if (millis != 0)
            itrsPerMs = iterations/millis;
        System.out.println("    Liczba iteracji na ms ---> " +
                            itrsPerMs);
    }
    public static void main(String[] args) {
        System.out.println("Rozpoczynanie rozgrzewki ...");
        doTest(1000000L);
        System.out.println("Pierwsza rozgrzewka zakoczona.");
        System.out.println("Rozpoczynanie drugiej rozgrzewki ...");
        doTest(900000000L);
        System.out.println("Druga rozgrzewka zakoczona.");
        System.out.println("Rozpoczynanie interwau pomiarowego ...");
        doTest(900000000L);
        System.out.println("Zakoczenie interwau pomiarowego.");
        System.out.println("Test zakoczony.");
    }
}
--------------------------------------------------------------------------------------------------------------------------------------
public class SimpleExample {
    final private static long ITERATIONS = 5000000000L;
    final private static long WARMUP = 10000000L;
    final private static long NANOS_PER_MS = 1000L * 1000L;
    private static boolean equalsTest(String s) {
        boolean b = s.equals(s);
        return b;
    }
    private static long doTest(long n) {
        long start = System.nanoTime();
        for (long i = 0; i < n; i++) {
            equalsTest("ABC");
        }
        long end = System.nanoTime();
        return end - start;
    }
    private static void printStats(long n, long nanos) {
        float itrsPerMs = 0;
        float millis = nanos/NANOS_PER_MS;
        if (millis != 0) {
            itrsPerMs = n/(nanos/NANOS_PER_MS);
        }
        System.out.println("    Czas, ktry upyn w ms -> " + millis);
        System.out.println("    Iteracje / ms ----> " + itrsPerMs);
    }
    public static void main(String[] args) {
        System.out.println("Rozpoczynanie rozgrzewki ...");
        long nanos = doTest(WARMUP);
        System.out.println("Pierwsza rozgrzewka zakoczona.");
        printStats(WARMUP, nanos);
        System.out.println("Rozpoczynanie drugiej rozgrzewki ...");
        nanos = doTest(WARMUP);
        System.out.println("Druga rozgrzewka zakoczona.");
        printStats(WARMUP, nanos);
        System.out.println("Rozpoczynanie interwau pomiarowego ...");
        nanos = doTest(ITERATIONS);
        System.out.println("Zakoczenie interwau pomiarowego.");
        System.out.println("Test zakoczony.");
        printStats(ITERATIONS, nanos);
    }
}
--------------------------------------------------------------------------------------------------------------------------------------
// Interfejs Shape
public interface Shape {
    public double area();
}
// Klasa Square
public class Square implements Shape {
    final private double side;
    public Square(double side) {
        this.side = side;
    }
    private Square(){side = 0;}
    public double area() {
        return side * side;
    }
}
// Klasa Rectangle
public class Rectangle implements Shape {
    final private double length, width;
    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }
    private Rectangle(){length = width = 0;}
    public double area() {
        return length * width;
    }
}
// Klasa RightTriangle
public class RightTriangle implements Shape {
    final private double base, height;
    public RightTriangle(double base, double height) {
        this.base = base;
        this.height = height;
    }
    private RightTriangle(){base = height = 0;}
    public double area() {
        return .5 * base * height;
    }
}
--------------------------------------------------------------------------------------------------------------------------------------
public class Area {
    final static long ITERATIONS = 5000000000L;
    final static long NANOS_PER_MS = (1000L * 1000L);
    final static StringBuilder sb = new StringBuilder();
    private static void printStats(String s, long n,
                                   long elapsedTime){
        float millis = elapsedTime / NANOS_PER_MS;
        float rate = 0;
        if (millis != 0) {
            rate = n / millis;
        }
        System.out.println(s + ": Czas, ktry upyn w ms -> " + millis);
        System.out.println(s + ": Liczba iteracji na ms --> " + rate);
    }
    private static long doTest(String str, Shape s, long n) {
        double area = 0;
        long start = System.nanoTime();
        for (long i = 0; i < n; i++) {
            area = s.area();
        }
        long elapsedTime = System.nanoTime() - start;
        sb.append(str).append(area);
        System.out.println(sb.toString());
        sb.setLength(0);
        return elapsedTime;
    }
    public static void main(String[] args) {
        String areaStr = "    Obszar: ";
        Shape s = new Square(25.33);
        Shape r = new Rectangle(20.75, 30.25);
        Shape rt = new RightTriangle(20.50, 30.25);
        System.out.println("Rozpoczynanie rozgrzewki ...");
        long elapsedTime = doTest(areaStr, s, ITERATIONS);
        printStats("    Square", ITERATIONS, elapsedTime);
        elapsedTime = doTest(areaStr, r, ITERATIONS);
        printStats("    Rectangle", ITERATIONS, elapsedTime);
        elapsedTime = doTest(areaStr, rt, ITERATIONS);
        printStats("    Right Triangle", ITERATIONS, elapsedTime);
        System.out.println("Pierwsza rozgrzewka zakoczona.");
        System.out.println("Rozpoczynanie drugiej rozgrzewki ...");
        elapsedTime = doTest(areaStr, s, ITERATIONS);
        printStats("    Square", ITERATIONS, elapsedTime);
        elapsedTime = doTest(areaStr, r, ITERATIONS);
        printStats("    Rectangle", ITERATIONS, elapsedTime);
        elapsedTime = doTest(areaStr, rt, ITERATIONS);
        printStats("    Right Triangle", ITERATIONS, elapsedTime);
        System.out.println("Druga rozgrzewka zakoczona.");
        System.out.println("Rozpoczynanie interwau pomiarowego ...");
        elapsedTime = doTest(areaStr, s, ITERATIONS);
        printStats("    Square", ITERATIONS, elapsedTime);
        elapsedTime = doTest(areaStr, r, ITERATIONS);
        printStats("    Rectangle", ITERATIONS, elapsedTime);
        elapsedTime = doTest(areaStr, rt, ITERATIONS);
        printStats("    Right Triangle", ITERATIONS, elapsedTime);
        System.out.println("Interwa pomiarowy zakoczony.");
    }
}

