/*
 * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.sun.s1asdev.ejb.util.methodmap.client;

import java.util.Map;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import com.sun.ejb.containers.util.MethodMap;
import java.lang.reflect.Method;

public class MethodPerf {

    public static String toMicroSeconds(long timeInMillis, int numIterations) {

        return ((timeInMillis * 1000.0) / numIterations) + " micro-seconds";
    }

    public static void main(String args[]) {


        String className = args[0];
        System.out.println("Classname = " + className);
        int numIterations = Integer.parseInt(args[1]);
        System.out.println("num iterations = " + numIterations);

        try {
            Class clz = Class.forName(className);

            Map methodMap = new HashMap();

            Method[] methods = clz.getMethods();

            for(int i = 0; i < methods.length; i++) {
                methodMap.put(methods[i], methods[i].toString());
            }


            System.out.println("--------------------");
            System.out.println("With regular hashmap");
            System.out.println("--------------------");
            int totalTime = 0;
            for(int i = 0; i < methods.length; i++) {
                Method m = methods[i];
                long time = testMethodLookup(methodMap, m, numIterations);
                totalTime += time;
                System.out.println(toMicroSeconds(time, numIterations) + " : " + m.getName());
            }
            System.out.println("Avg time = " +
                               toMicroSeconds(totalTime / methods.length,
                                              numIterations));


            System.out.println("--------------------");
            System.out.println("With optimized method lookup");
            System.out.println("--------------------");

            methodMap = new MethodMap(methodMap);
            totalTime = 0;
            for(int i = 0; i < methods.length; i++) {
                Method m = methods[i];
                long time = testMethodLookup(methodMap, m, numIterations);
                totalTime += time;
                System.out.println(toMicroSeconds(time, numIterations) + " : " + m.getName());
            }
            System.out.println("Avg time = " +
                               toMicroSeconds(totalTime / methods.length,
                                              numIterations));


            System.out.println("--------------------");
            System.out.println("With extra optimized method lookup");
            System.out.println("--------------------");

            methodMap = new MethodMap(methodMap, methods.length * 20);
            totalTime = 0;
            for(int i = 0; i < methods.length; i++) {
                Method m = methods[i];
                long time = testMethodLookup(((MethodMap)methodMap), m, numIterations);
                totalTime += time;
                System.out.println(toMicroSeconds(time, numIterations) + " : " + m.getName());
            }
            System.out.println("Avg time = " +
                               toMicroSeconds(totalTime / methods.length,
                                              numIterations));

            /*
            System.out.println("--------------------");
            System.out.println("With java.util.IdentityHashMap lookup");
            System.out.println("--------------------");

            methodMap = new java.util.IdentityHashMap(methodMap);

            for(int i = 0; i < methods.length; i++) {
                Method m = methods[i];
                long time = testMethodLookup(methodMap, m, numIterations);
                System.out.println(toMicroSeconds(time, numIterations) + " : " + m.getName());
            }

            */


            long ihcTime = testSystemIdentityHashCode(numIterations);
            System.out.println("system identity hash code= " + toMicroSeconds(ihcTime, numIterations));


            MethodPerf ml = new MethodPerf();

            long sTime = testStaticStronglyTypedInvocation(numIterations);
            Method fooMethod = MethodPerf.class.getMethod("foo", null);
            System.out.println("static strong typed invocation time = " + toMicroSeconds(sTime, numIterations));
            long rTime = testStaticReflectiveInvocation(numIterations, fooMethod);
            System.out.println("static reflective invocation time = " + toMicroSeconds(rTime, numIterations));

            long i_sTime = testStaticStronglyTypedInvocation(numIterations);
            Method barMethod = MethodPerf.class.getMethod("bar", null);
            System.out.println("instance strong typed invocation time = " + toMicroSeconds(i_sTime, numIterations));
            long i_rTime = testStaticReflectiveInvocation(numIterations, fooMethod);
            System.out.println("instance reflective invocation time = " + toMicroSeconds(i_rTime, numIterations));

        } catch(Exception e) {
            e.printStackTrace();
        }

    }



    private static long testMethodLookup(MethodMap methodMap, Method m, int numIterations)
    {
        int numParams = m.getParameterTypes().length;

        long begin = System.currentTimeMillis();
        for(int i = 0; i < numIterations; i++) {
            methodMap.get(m, numParams);
        }
        long end = System.currentTimeMillis();


        // measure the time for the loop processing itself
        long beginLoop = System.currentTimeMillis();
        for(int i = 0; i < numIterations; i++) {
        }
        long endLoop = System.currentTimeMillis();
        long loopTime = endLoop - beginLoop;
        System.out.println("Loop time = " + loopTime);
        return (end - begin) - loopTime;
    }

    private static long testMethodLookup(Map methodMap, Method m, int numIterations)
    {
        long begin = System.currentTimeMillis();
        for(int i = 0; i < numIterations; i++) {
            methodMap.get(m);
        }
        long end = System.currentTimeMillis();

        // measure the time for the loop processing itself
        long beginLoop = System.currentTimeMillis();
        for(int i = 0; i < numIterations; i++) {
        }
        long endLoop = System.currentTimeMillis();
        long loopTime = endLoop - beginLoop;
        System.out.println("Loop time = " + loopTime);
        return (end - begin) - loopTime;
    }

 private static long testSystemIdentityHashCode(int numIterations) {
     Object o = new Object();
        long begin = System.currentTimeMillis();
        for(int i = 0; i < numIterations; i++) {
            System.identityHashCode(o);
        }
        long end = System.currentTimeMillis();

        // measure the time for the loop processing itself
        long beginLoop = System.currentTimeMillis();
        for(int i = 0; i < numIterations; i++) {
        }
        long endLoop = System.currentTimeMillis();
        long loopTime = endLoop - beginLoop;
        System.out.println("Loop time = " + loopTime);
        return (end - begin) - loopTime;
    }


    private static long testStaticStronglyTypedInvocation(int numIterations) {
        long begin = System.currentTimeMillis();
        for(int i = 0; i < numIterations; i++) {
            MethodPerf.foo();
        }
        long end = System.currentTimeMillis();

        // measure the time for the loop processing itself
        long beginLoop = System.currentTimeMillis();
        for(int i = 0; i < numIterations; i++) {
        }
        long endLoop = System.currentTimeMillis();
        long loopTime = endLoop - beginLoop;
        System.out.println("Loop time = " + loopTime);
        return (end - begin) - loopTime;
    }

    private static long testInstanceStronglyTypedInvocation(int numIterations, MethodPerf ml) {
        long begin = System.currentTimeMillis();
        for(int i = 0; i < numIterations; i++) {
            ml.bar();
        }
        long end = System.currentTimeMillis();

        // measure the time for the loop processing itself
        long beginLoop = System.currentTimeMillis();
        for(int i = 0; i < numIterations; i++) {
        }
        long endLoop = System.currentTimeMillis();
        long loopTime = endLoop - beginLoop;
        System.out.println("Loop time = " + loopTime);
        return (end - begin) - loopTime;
    }

    private static long testStaticReflectiveInvocation(int numIterations, Method m)
        throws Exception {

        long begin = System.currentTimeMillis();
        for(int i = 0; i < numIterations; i++) {
            m.invoke(null, null);
        }
        long end = System.currentTimeMillis();

        // measure the time for the loop processing itself
        long beginLoop = System.currentTimeMillis();
        for(int i = 0; i < numIterations; i++) {
        }
        long endLoop = System.currentTimeMillis();
        long loopTime = endLoop - beginLoop;
        System.out.println("Loop time = " + loopTime);
        return (end - begin) - loopTime;
    }

    private static long testInstanceReflectiveInvocation(int numIterations, Object o, Method m)
        throws Exception {

        long begin = System.currentTimeMillis();
        for(int i = 0; i < numIterations; i++) {
            m.invoke(o, null);
        }
        long end = System.currentTimeMillis();

        // measure the time for the loop processing itself
        long beginLoop = System.currentTimeMillis();
        for(int i = 0; i < numIterations; i++) {
        }
        long endLoop = System.currentTimeMillis();
        long loopTime = endLoop - beginLoop;
        System.out.println("Loop time = " + loopTime);
        return (end - begin) - loopTime;
    }


    public static void foo() {}

    public MethodPerf() {}

    public static void bar() {}

}
