eat cpu 怎么写一个消耗指定cpu百分比的测试?消耗cpu就是指的就是消耗cpu的时间.所以基本的原理就是按百分比吃掉cpu的时间.比如要消耗30%的cpu,假设单位时间是100ms,那就是跑满30ms,然后sleep 70ms.代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 public class CpuUtil_Single { public static final int TIME_UNIT_MS = 100 ; public static double tmp; public static void main (String[] args) throws Exception { int cpuUtil = 30 ; if (args.length != 0 ) { cpuUtil = Integer.valueOf(args[0 ]); } if (cpuUtil < 5 || cpuUtil > 80 ) { throw new IllegalArgumentException ("cpuUtil must be between 5 and 80" ); } int runTime = TIME_UNIT_MS * cpuUtil / 100 ; int sleepTime = TIME_UNIT_MS - runTime; System.out.println("runTime(ms):" + runTime + ",sleepTime(ms):" + sleepTime); while (true ) { eatCpuTime(runTime); Thread.sleep(sleepTime); } } public static void eatCpuTime (long useTimeMs) { long start = System.nanoTime(); long useTimeNano = useTimeMs * 1000000 ; while (true ) { for (int i = 0 ; i < 10000 ; i++) { tmp = Math.sqrt(i) * Math.sqrt(i); } if ((System.nanoTime() - start) >= useTimeNano) { break ; } } } }
运行一下试试:
1 2 3 4 javac CpuUtil_Single.java //后面的参数表示,把cpu跑到40% java CpuUtil_Single 40
如果你的机器是单核的cpu,上面的代码没啥问题,还是比较准的.但如果是多核的就有问题了,需要改造一下.代码引起的变化可以用top命令看看,前面那个代码只能把其中一个核跑起来,后面这个则是每个核都跑起来了.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CpuUtil_Multi { public static final int TIME_UNIT_MS = 100 ; public static double tmp; public static final int CpuCoreNum = Runtime.getRuntime().availableProcessors(); public static ExecutorService MyExecutor = Executors.newFixedThreadPool(CpuCoreNum); public static void main (String[] args) throws Exception { int cpuUtil = 30 ; if (args.length != 0 ) { cpuUtil = Integer.valueOf(args[0 ]); } if (cpuUtil < 5 || cpuUtil > 80 ) { throw new IllegalArgumentException ("cpuUtil must be between 5 and 80" ); } int runTime = TIME_UNIT_MS * cpuUtil / 100 ; int sleepTime = TIME_UNIT_MS - runTime; System.out.println("runTime(ms):" + runTime + ",sleepTime(ms):" + sleepTime + ",CpuCoreNum:" + CpuCoreNum); for (int i = 0 ; i < CpuCoreNum; i++) { MyExecutor.execute(() -> { while (true ) { try { eatCpuTime(runTime); Thread.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } } }); } } public static void eatCpuTime (long useTimeMs) { long start = System.nanoTime(); long useTimeNano = useTimeMs * 1000000 ; while (true ) { for (int i = 0 ; i < 10000 ; i++) { tmp = Math.sqrt(i) * Math.sqrt(i); } if ((System.nanoTime() - start) >= useTimeNano) { break ; } } } }