zoukankan      html  css  js  c++  java
  • 统计方法运行时间【Java实现】

       接口Command:定义命令的执行操作

    package common;
    
    public interface Command {
        
        // 运行方法
        void run();
    
    }

     CommandRuntime 类:统计命令运行时间,使用命令模式

    package common;
    
    public class CommandRuntime {
        
        private Command command;
        
        public CommandRuntime(Command command) 
        {
            this.command = command;
        }
    
        public long runtime() {
            
            long start = System.currentTimeMillis();
            command.run();
            long end = System.currentTimeMillis();
            
            return end-start;
        }
        
    
    }

        CombinationCommand:  解决组合问题的命令, 采用类适配器模式:

    package algorithm.problems;
    
    import algorithm.permutation.Combination;
    
    import common.Command;
    
    public class CombinationCommand extends Combination implements Command {
    
        public CombinationCommand(int n) {
            super(n);
        }
    
        public void run() {
            solution();
        }
    
    }

       

        CombinationRuntime: 测量组合问题的运行时间   

    package algorithm.problems;
    
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.IOException;
    
    import common.CommandRuntime;
    
    public class CombinationRuntime {
        
        public static void main(String[] args)
        {
            try {
                BufferedWriter fileWriter = new BufferedWriter(new FileWriter("runtime.txt"));
                fileWriter.write("runtime: ");
                fileWriter.newLine();
                for (int i=1; i < 30; i++) {
                       CommandRuntime comRuntime = new CommandRuntime(new CombinationCommand(i));
                       long runtime = comRuntime.runtime();
                       fileWriter.write( "n = " + i + " : " + runtime + " ms");
                       fileWriter.newLine();
                }
                System.out.println("over.");
                fileWriter.close();
                
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        }
    
    }

      另外一种使用反射机制实现的运行时间测量框架:

    package common;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    
    public class RuntimeMeasurement {
        
        public RuntimeMeasurement(int maxsize) {
            this.maxsize = maxsize;
            time = new double[maxsize];
        }
        
        // 问题最大规模: 以 10 的 size 次幂计
        private int maxsize ;
        
        // 运行时间以 ms 计
        private double[] time ;
        
        /**
         * measureTime : 对指定类型的对象调用指定参数列表的指定方法,并测量其运行时间
         * @param type  指定对象类型,必须有一个 参数类型为 int 的公共构造器方法
         * @param methodName  指定测试方法名称,要求是空参数列表
         */
        public void measureTime(Class<?> type, String methodName)
        {
            try {
                 Constructor<?> con = type.getConstructor(int.class);
                 Method testMethod = null;
                 for (int i = 0; i < time.length; i++) {    
                      Object obj = con.newInstance(power10(i+1));
                      testMethod = type.getMethod(methodName, new Class<?>[]{});
                      long start = System.nanoTime();  
                      testMethod.invoke(obj, new Object[] {});
                      long end = System.nanoTime();
                      time[i] =  ((end - start) / (double)1000000) ;       
                    }
                  
            } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println(e.getMessage());
            }
                
        }
        
        /**
         * showTime : 显示已经测量获得的运行时间,在 measureTime 方法调用后调用该方法。
         */
        public void showTime()
        {
            for (int i=0; i < time.length; i++) {
                System.out.printf("n = %12d : " , power10(i+1));    
                System.out.printf("%12.3f
    ", time[i]);    
            }
        }
    
        private int power10(int n)
        {
            int result = 1;
            while (n > 0) {
                result *= 10;
                n--;
            }
            return result;
        }
        
    }
  • 相关阅读:
    电工知识:3种方法测电容的好坏,万用表三个档位的巧妙应用
    ps 教程
    绘声绘影 设置不联网
    推荐.Net、C# 逆向反编译四大工具利器
    MOOC 网站:Coursera、Udacity、edX
    深度强化学习资料(视频+PPT+PDF下载)
    李飞飞、吴恩达、Bengio等人的15大顶级深度学习课程
    tf.name_scope()和tf.variable_scope()
    Linux 进程(一):环境及其控制
    Linux I/O总结
  • 原文地址:https://www.cnblogs.com/lovesqcc/p/4038393.html
Copyright © 2011-2022 走看看