この方式はもっと優雅で、ストップウォッチは時間を計ります


原文を読む:この方法はもっと優雅で、秒表は時間を計ります!
学校の100メートル競走の時、体育の先生が持っていたストップウォッチを見たことがありますか.先生はどのように8つの滑走路の中の学生がどのくらい走ったか覚えていますか.
今日私たちがしなければならないのは先生の手の中の秒表を実現することですが、私たちのコンピュータは本当にnつの任務を同時に走ることができなくて、私たちは1つだけ走って次の1つを走ることができます.
多くの人が統計をとると以下になりますが、方法は優雅ではありません.統計をより優雅にするために、ストップウォッチを実現しましょう.
public class Test{

    public static void main(String[] args) {
       long s =  System.currentTimeMillis();
       //   1
       // do something
       long s1 = System.currentTimeMillis() - s;
       System.out.println("         :"+s1);
       //   2
       // do something
       long s2 = System.currentTimeMillis() - s1;
       System.out.println("         :"+s2);
    }
}

このコードを見終わったら、あなたに聞いて、いらいらしませんか?
問題点
では、私たちはどこにうんざりしていますか?
  • 毎回取得時間コード
  • を取得する.
  • 毎回
  • をアクティブに印刷する
  • 重要でないタイミング印刷コードが視線を占める
  • .
  • nセグメントコード統計比較の場合、手動比較またはハードコーディング比較
  • が必要である.
    はい、問題は分かりました.解決策を考えてみましょう.
    ソリューション
  • は、時間毎に減少する代替
  • の代わりに1つの方法をカプセル化する.
  • 印刷最終統合出力
  • 統計各セグメント使用時、ソートまたは比較
  • ストップウオッチを実現しましょう
  • 各セグメントのタイミングタスクには、一意の識別と最終使用時間
  • が必要です.
  • は、各タイミングタスク
  • を格納するためのコンテナを必要とする.
  • 合計時間およびタスク数を記録する必要がある
  • 具体的な実装
  • 各タイミングタスククラス
  • public class Task {
            private String name;
            private long timeMillis;
    
            public Task(String name, long timeMillis) {
                this.name = name;
                this.timeMillis = timeMillis;
            }
    }
  • 秒表類
  • public class StopWatch {
        /*
         *           
         */
        private List tasks = new ArrayList<>();  
        /*
         *        
         */
        private String currentName; 
        /*
         *          
         */
        private long startMillis;   
        /*
         *    
         */
        private long totalMillis;  
    
        public StopWatch() {
        }
        /**
         *     
         * @param taskName    
         */
        public void start(String taskName) {
            if (currentName != null){
                stop();
            }
            this.currentName = taskName;
            this.startMillis = System.currentTimeMillis();
        }
        /**
         *     
         */
        public void stop() {
            if (null == currentName) {
                throw new RuntimeException("");
            }
            long spend = System.currentTimeMillis() - startMillis;
            totalMillis += spend;
            Task task = new Task(currentName, spend);
            tasks.add(task);
        }
    
        public int size() {
            return tasks.size();
        }
    
        /**
         *     
         */
        public void print() {
            if (currentName != null){
                stop();
            }
            StringBuilder s = new StringBuilder();
            s.append("    \t  \t  \t
    "); for (Task task : tasks) { s.append(task.getName() + "\t"); s.append(task.getTimeMillis() + "\t"); double l = task.getTimeMillis() / (double)totalMillis; s.append(String.format("%.2f",l) + "\t
    "); } s.append(" :" + totalMillis); System.out.println(s.toString()); } }
  • では、今どうすればいいか見てみましょう.
  • public class Test {
    
        public static void main(String[] args){
            StopWatch stopWatch = new StopWatch();
    
            stopWatch.start("  1");
            TimeUnit.SECONDS.sleep(1);
    
            stopWatch.start("  2");
            TimeUnit.SECONDS.sleep(2);
    
            stopWatch.print();
        }
    }

    この时、私は満足のいく笑颜を漏らしました![表情]
    最後に、Apache commons、Spring core、Google guavaは私たちに少し異なるStopWatchクラスを実現しました!
    もしあなたが私と一緒にStopWatchを実現したら、この3つの提供を見てみましょう.so easy!