`

让CPU舞动起来

阅读更多
搞个CPU画图玩玩。



目标:







/**
 * let CPU draw line
 * @author 贾懂凯      QQ 305657490
 * @date  2010-10-20 下午09:36:54
 *
 */
public class CPUTest {

	public static void main(String args[]){
		int busyTime=10;//如果是单核这边的busyTime越小画出的线越正。不过双核就不一定了。
		int idleTime=busyTime;
		long startTime=0;
		//sleep 10ms each busy loop。微观上等量的busy和idle,宏观上表现为CPU的占用率为50%。
		while(true){
			startTime=System.currentTimeMillis();
			//busy loop
			while((System.currentTimeMillis()-startTime)<=busyTime);
			//idle loop
			try{
				Thread.sleep(idleTime);
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}
};


上面的程序在我机子上实际运行效果:




/**
 * let CPU draw Sine curve
 * @author 贾懂凯      QQ 305657490
 * @date  2010-10-20 下午09:39:43
 *
 */
public class CPUTest01 {

	public static void main(String args[]){
		//角度的分割
		final double SPLIT=0.01;
		//2PI/ 分割的次数,也就是2*PI/0.01,正好是一周
		final double PI=Math.PI;
		final int COUNT=(int)(2*PI/SPLIT);//将一圈的弧度按SPLIT分成的份数
		
		
		final int INTERVAL=200;//一次循环的时间
		long[] busySpan=new long[COUNT];
		long[] idleSpan=new long[COUNT];
		int half=INTERVAL/2;
		double radian=0.0;
		for(int i=0;i<COUNT;i++){
			busySpan[i] =(long)(half+(Math.sin(PI*radian)*half));
			idleSpan[i]=INTERVAL-busySpan[i];
			radian+=SPLIT;
		}
		long startTime=0;
		int j=0;
		
		//微观上保证每个小的时间片段(200ms)中,CPU的使用率变化规律符合正弦曲线
		//因为任务管理器每隔1秒统计一次(标准更新水平下),所以1秒内统计的时候有五个微观周期,宏观表现基本表现为正弦规律。没有太大的误差。
		while(true){
			j=j%COUNT;
			startTime=System.currentTimeMillis();
			while(System.currentTimeMillis()-startTime<busySpan[j]);
			try {
				Thread.sleep(idleSpan[j]);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			j++;
		}
	}
};



这个运行效果也不好。
原因是我的Computer是Core 2的,程序是OK的。如果是单核效果会很明显。本人暂时还没找到Java控制双核CPU分配的方法。

进一步分析:
如果排除该程序程序之外的线程的CPU开销(如系统线程)和该程序不必要的CPU开销(如让Java线程停止休眠的开销),理论上一个loop的周期在任务管理器的一个刷新周期内的任何一个值最后画出的图形都是没有区别的。网上有些人的loop周期越短越好的观点实际上是不成立的。
如果考虑这些额外的开销,将loop周期定在任务管理器的刷新周期附近比较好(标准1s,慢4s,快0.5s)。

我们大家可以尝试深入的切入点:
1、找一个单核CPU验证下我的理论分析的观点是否正确。出结果了别忘了告诉我哦!
2、进一步去了解多核CPU的工作原理和Java对CPU的分配控制,实现两个核的差异化运作,也就是网上说的“左手画圆,右手画方”(网上的已经实现的例子是假的的)。

  • 大小: 15.3 KB
  • 大小: 15.4 KB
  • 大小: 17.5 KB
分享到:
评论
2 楼 luliangy 2012-04-06  
编程之美嘿嘿
1 楼 freewxy 2010-10-21  

相关推荐

Global site tag (gtag.js) - Google Analytics