package org.sef4j.callstack; import org.sef4j.callstack.stats.ThreadTimeUtilsTest; public class ThreadCpuTstUtils { static { cpuLoop(10000); // hot compile.. sleep(10); cpuLoop(10000); // hot compile.. sleep(10); } // public static final long cpuLoopCountFor100Millis = cpuLoopCountForMillis(100); public static void sleep(long millis) { try { Thread.sleep(millis); } catch(InterruptedException ex) { // ignore, no rethrow! } } public static void cpuLoop(long cpuLoopCount) { for (int i = 0; i < cpuLoopCount; i++) { int dbg = i; if (dbg%2 == 0) dbg++; dbg *= 2; } } public static void sleepAndCpu(long sleepMillis, long threadCpuLoop) { if (sleepMillis > 0) { sleep(sleepMillis); } if (threadCpuLoop > 0) { cpuLoop(threadCpuLoop); } } public static long cpuLoopCountForMillis(long threadCpuMillis) { long cpuLoopCalibrate = 40000000; long startTime = System.nanoTime(); cpuLoop(cpuLoopCalibrate); long cpuTimeCalibrateMillis = (System.nanoTime() - startTime) / 1000000; long cpuLoop = cpuLoopCalibrate * threadCpuMillis / cpuTimeCalibrateMillis; // check long checkStartTime = System.nanoTime(); cpuLoop(cpuLoop); long checkCpuTime = (System.nanoTime() - checkStartTime) / 1000000; ThreadTimeUtilsTest.assertApproxEquals(threadCpuMillis, checkCpuTime, 60); // precision 60 ms ??? return cpuLoop; } }