Classe de chronomètre pour Java
quelle classe Java devez-vous utiliser pour mesurer la performance temporelle?
(on peut utiliser n'importe quelle classe de date/heure, mais la raison pour laquelle je demande est dans .Net il y a un désigné Stopwatch class for this purpose)
8 réponses
  le cadre de ressort a un excellent     StopWatch  classe   :  
StopWatch stopWatch = new StopWatch("My Stop Watch");
stopWatch.start("initializing");
Thread.sleep(2000); // simulated work
stopWatch.stop();
stopWatch.start("processing");
Thread.sleep(5000); // simulated work
stopWatch.stop();
stopWatch.start("finalizing");
Thread.sleep(3000); // simulated work
stopWatch.stop();
System.out.println(stopWatch.prettyPrint());
produit:
    StopWatch 'My Stop Watch': running time (millis) = 10000
    -----------------------------------------
    ms     %     Task name
    -----------------------------------------
    02000  020%  initializing
    05000  050%  processing
    03000  030%  finalizing
  
    	                de java.lang.Système.nanoTime ()
ou vous pouvez utiliser le chronomètre fourni dans apache commons. Cette classe utilise java.lang.Système.currentTimeMillis ()
http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/StopWatch.html
Ceci est un exemple d'utilisation du chronomètre pour définir des mesures multiples en annotant des méthodes dédiées. Très utile et très simple à utiliser pour mesurer par exemple les appels de Service sur plusieurs appels / opérations embarqués et ainsi de suite.
StopWatchHierarchy
package ch.vii.spring.aop;
import java.util.Arrays;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
@Component
public class ProfilingMethodInterceptor implements MethodInterceptor {
    private static final Logger log = LoggerFactory.getLogger(ProfilingMethodInterceptor.class);
    public Object invoke(MethodInvocation invocation) throws Throwable {
        if (log.isInfoEnabled()) {
            String stopWatchName = invocation.getMethod().toGenericString();
            StopWatchHierarchy stopWatch = StopWatchHierarchy.getStopWatchHierarchy(stopWatchName);
            String taskName = invocation.getMethod().getName();
            stopWatch.start(taskName);
            try {
                return invocation.proceed();
            } finally {
                stopWatch.stop();
            }
        } else {
            return invocation.proceed();
        }
    }
    static class StopWatchHierarchy {
        private static final ThreadLocal<StopWatchHierarchy> stopwatchLocal = new ThreadLocal<StopWatchHierarchy>();
        private static final IndentStack indentStack = new IndentStack();
        static StopWatchHierarchy getStopWatchHierarchy(String id) {
            StopWatchHierarchy stopWatch = stopwatchLocal.get();
            if (stopWatch == null) {
                stopWatch = new StopWatchHierarchy(id);
                stopwatchLocal.set(stopWatch);
            }
            return stopWatch;
        }
        static void reset() {
            stopwatchLocal.set(null);
        }
        final StopWatch stopWatch;
        final Stack stack;
        StopWatchHierarchy(String id) {
            stopWatch = new StopWatch(id);
            stack = new Stack();
        }
        void start(String taskName) {
            if (stopWatch.isRunning()) {
                stopWatch.stop();
            }
            taskName = indentStack.get(stack.size) + taskName;
            stack.push(taskName);
            stopWatch.start(taskName);
        }
        void stop() {
            stopWatch.stop();
            stack.pop();
            if (stack.isEmpty()) {
                log.info(stopWatch.prettyPrint());
                StopWatchHierarchy.reset();
            } else {
                stopWatch.start(stack.get());
            }
        }
    }
    static class Stack {
        private int size = 0;
        String elements[];
        public Stack() {
            elements = new String[10];
        }
        public void push(String e) {
            if (size == elements.length) {
                ensureCapa();
            }
            elements[size++] = e;
        }
        public String pop() {
            String e = elements[--size];
            elements[size] = null;
            return e;
        }
        public String get() {
            return elements[size - 1];
        }
        public boolean isEmpty() {
            return size == 0;
        }
        private void ensureCapa() {
            int newSize = elements.length * 2;
            elements = Arrays.copyOf(elements, newSize);
        }
    }
    static class IndentStack {
        String elements[] = new String[0];
        public String get(int index) {
            if (index >= elements.length) {
                ensureCapa(index + 10);
            }
            return elements[index];
        }
        private void ensureCapa(int newSize) {
            int oldSize = elements.length;
            elements = Arrays.copyOf(elements, newSize);
            for (int i = oldSize; i < elements.length; i++) {
                elements[i] = new String(new char[i]).replace(""151900920"", "|   ");
            }
        }
    }
}
conseiller
package ch.vii.spring.aop;
import java.lang.reflect.Method;
import org.aopalliance.aop.Advice;
import org.springframework.aop.Pointcut;
import org.springframework.aop.support.AbstractPointcutAdvisor;
import org.springframework.aop.support.StaticMethodMatcherPointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ProfilingAdvisor extends AbstractPointcutAdvisor {
    private static final long serialVersionUID = 1L;
    private final StaticMethodMatcherPointcut pointcut = new StaticMethodMatcherPointcut() {
        public boolean matches(Method method, Class<?> targetClass) {
            return method.isAnnotationPresent(ProfileExecution.class);
        }
    };
    @Autowired
    private ProfilingMethodInterceptor interceptor;
    public Pointcut getPointcut() {
        return this.pointcut;
    }
    public Advice getAdvice() {
        return this.interceptor;
    }
}
Annotation De Profil D'Exécution
package ch.vii.spring.aop;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
public @interface ProfileExecution {
}
annoter votre code
package ch.vii.spring;                                                                                                                                                                 
import org.springframework.beans.factory.annotation.Autowired;                                      
import org.springframework.stereotype.Component;                                                    
import ch.vii.spring.aop.ProfileExecution;                                                          
@Component                                                                                          
public class Bean {                                                                                 
    @Autowired                                                                                      
    InnerBean innerBean;  
    @ProfileExecution                                                                               
    public void foo() {                                                                             
        innerBean.innerFoo();                                                                      
        innerBean.innerFoo2();                                                                      
        innerBean.innerFoo();                                                                       
    }                                                                                                                                                                                         
}  
public class InnerBean {
    @Autowired
    InnerInnerBean innerInnerBean;
    @ProfileExecution
    public void innerFoo() {
    }
    @ProfileExecution
    public void innerFoo2() {
        innerInnerBean.innerInnerFoo();
        innerInnerBean.innerInnerFoo();
        innerInnerBean.innerInnerFoo();
    }
}                                                                                                    
sortie
09:58:39.627 [main] INFO  c.v.s.aop.ProfilingMethodInterceptor - StopWatch 'public void ch.vii.spring.Bean.foo()': running time (millis) = 215
-----------------------------------------
ms     %     Task name
-----------------------------------------
00018  008 %  foo
00026  012 %  |   innerFoo
00001  000 %  foo
00016  007 %  |   innerFoo2
00038  018 %  |   |   innerInnerFoo
00000  000 %  |   innerFoo2
00024  011 %  |   |   innerInnerFoo
00028  013 %  |   innerFoo2
00024  011 %  |   |   innerInnerFoo
00029  013 %  |   innerFoo2
00000  000 %  foo
00011  005 %  |   innerFoo
00000  000 %  foo
Check out perf4j. Le "stop watch" du printemps est principalement destiné au développement local. Perf4j peut prendre en charge à la fois votre timing de type POC et un environnement de production.
vous pouvez essayer système.currentTimeMillis () , mais aussi il y a un bon profilage options sous certains IDEs bien connus, tels que eclipse et netbeans. En outre, loin de L'IDE, vous pouvez essayer profileurs autonomes dans vos tâches de mesure de performance. Je pense qu'en utilisant profilers vous obtiendrez de meilleurs résultats qu'en utilisant système.currentTimeMillis () .
si vous voulez simplement le mesurer, utilisez une classe de chronomètre, ou peut-être juste un chronomètre.
le meilleur est D'utiliser le système.nanoTime(), cependant, si vous voulez obtenir les Tiques (elapsed Tiques) comme Système.Diagnostic.Chronomètre vous avez alors besoin de convertir des nanosecondes en tiques (1 Tick = 100 nanosecondes) et ensuite commencer à convertir entre nanos et millis, secondes, minutes, heures, puis finalement formater la sortie en une représentation du temps telle que celle de la méthode de temps écoulé () (hh:mm:SS.sssssss), cependant, ressemble à des Dates en Java utilisent seulement 3 millisecondes (hh:mm:SS.sss), donc vous devez également entraînement du format aussi bien.
j'ai fait une classe de chronomètre pour Java vous pouvez l'obtenir à partir de: http://carlosqt.blogspot.com/2011/05/stopwatch-class-for-java.html
exemple:
package stopwatchapp;
import java.math.BigInteger;
public class StopwatchApp {
    public static void main(String[] args) {
        Stopwatch timer = new Stopwatch();
        timer.start();
        Fibonacci(40);
        timer.stop();
        System.out.println("Elapsed time in ticks: " 
            + timer.getElapsedTicks());
        System.out.println("Elapsed time in milliseconds: " 
            + timer.getElapsedMilliseconds());
        System.out.println("Elapsed time in seconds: " 
            + timer.getElapsedSeconds());
        System.out.println("Elapsed time in minutes: " 
            + timer.getElapsedMinutes());
        System.out.println("Elapsed time in hours: " 
            + timer.getElapsedHours());
        System.out.println("Elapsed time with format: " 
            + timer.getElapsed());
    }
    private static BigInteger Fibonacci(int n)
    {
        if (n < 2)
            return BigInteger.ONE;
        else
            return Fibonacci(n - 1).add(Fibonacci(n - 2));
    }
}
La sortie:
// Elapsed time in ticks: 33432284
// Elapsed time in milliseconds: 3343
// Elapsed time in seconds: 3
// Elapsed time in minutes: 0
// Elapsed time in hours: 0
// Elapsed time with format: 00:00:03.3432284
Espérons que cette aide.
private void WaitTimer(long ms)
{
    long t = 0;
    long x = System.currentTimeMillis();
    while(t < ms)
    {
       t = System.currentTimeMillis() - x;
    }
}