让CPU舞动起来

[color=blue][align=center][size=large]搞个CPU画图玩玩。[/size][/align][/color]

[color=blue]
[size=medium]目标:[/size][/color]

[img]http://dl.iteye.com/upload/attachment/334707/dde6af03-1e9a-3213-b557-f5e63b0c3c50.jpg[/img]

[img]http://dl.iteye.com/upload/attachment/334709/fb006051-3241-305a-b72a-bf273b0a47ac.jpg[/img]


/**
* 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();
}
}
}
};


[color=blue][size=large]上面的程序在我机子上实际运行效果:[/size][/color]

[img]http://dl.iteye.com/upload/attachment/334711/fa422889-8023-331c-9670-0c1af21a5cc2.jpg[/img]



/**
* 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++;
}
}
};



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值