001    package ifs.util;
002    
003    /** CPU time measurement. JAVA profiling extension is used.
004     * Java needs to be executed with -Xrunjprof. When the java is executed outside
005     * this profiler, {@link System#currentTimeMillis()} is used.
006     *
007     * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
008     * @version 1.0
009     */
010    public class JProf {
011        private static boolean sPrecise = true;
012        
013        /** Current CPU time of this thread in seconds */
014        public static double currentTimeSec() {
015            return (sPrecise?((double)getCurrentThreadCpuTime())/1e9:((double)System.currentTimeMillis())/1e3);
016        }
017        /** Measurement is based on profiler extension (precise CPU time is returned). 
018         * If false, {@link System#currentTimeMillis()} is used in {@link JProf#currentTimeSec()}.
019         */
020        public static boolean isPrecise() { return sPrecise; }
021    
022        /** Current CPU time of this thread (will fail when jprof is not loaded). Use {@link JProf#currentTimeSec()}.*/
023        public static native long getCurrentThreadCpuTime();
024    
025        static {
026            try {
027                System.loadLibrary("jprof");
028                if (getCurrentThreadCpuTime()==0l) {
029                    int j=0;
030                    for (int i=0;i<10000000;i++) j+=i;
031                    if (getCurrentThreadCpuTime()==0l) {
032                        sPrecise = false;
033                        org.apache.log4j.Logger.getLogger(JProf.class).warn("Unable to mesure time in precise -- using System.currentTimeMillis().");
034                    }
035                }
036            } catch (Throwable e) {
037                org.apache.log4j.Logger.getLogger(JProf.class).warn("Unable to mesure time in precise -- using System.currentTimeMillis().");
038                sPrecise = false;
039            }       
040        }
041    }