需要实现提高CPU占用率的功能,用来做一个压力测试。
但是找了一下午发现没有相关工具,只有monkey这种测试稳定性的测试工具,以及内存压力测试工具。有关CPU的测试工具只能显示CPU的占用率。但是现实CPU占用率的话,Android Studio本身就带有显示功能。
后面发现一种思路,就是把一些耗时的代码写进app里面去,从而达到提升CPU占用率的目的。
首先我想新建一个线程,使用sleep达到占用CPU的目的,但是这样程序会崩溃,虽然提升了CPU的占用率但是内存溢出了(猜测可能是因为sleep时间太长)。
然后,我在线程内写了在for循环中对float进行运算操作,从而增加CPU的占用率。但是占用率不高。后面想到更新UI是较为耗时的操作,因此,在界面增加了2个TextView控件,新建两个Handler,在循环内对其控制更新。然后就基本稳定在CPU百分之40左右的占用率。
最后具体使用就在实际APP中添加一个Button控件,点击即开启线程,从而提高CPU占用率。
后面实际使用的时候发现了问题,加入到app中会崩掉,卡死。于是又改变了思路,删掉了更新UI的代码。新的代码在末尾。之前的代码还是写的太复杂了。新的代码比较简洁。主要是用到了一个while来实现增加CPU占用率。
MainActivity文件如下:
packagecom.demo.sleep;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.widget.TextView;
public classMainActivityextendsAppCompatActivity {
private static finalStringTAG="MainActivity";
privateTextViewmTextView;
privateTextViewmText;
privateHandlermHandler;
privateHandlermTextHandler;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView= (TextView)findViewById(R.id.text_view);
mText= (TextView)findViewById(R.id.text_id);
mHandler=newHandler(){
@Override
public voidhandleMessage(Message msg){
String s = (String) msg.obj;
mTextView.setText(s);
}
};
mTextHandler=newHandler(){
@Override
public voidhandleMessage(Message msg){
String s = (String) msg.obj;
mText.setText(s);
}
};
newThread(newRunnable() {
@Override
public voidrun() {
for(inti =0; i<10000;i++) {
floatsum =2.1f;
for(intj =0;j<1000;j++){
floatb =2.5f;
floatc =3.0f;
doubled = (double) (b*c +b-c);
doublef = (double) (b*b*b+c*c-b-c);
for(intaddnum =0;addnum <3000;addnum++) {
String s = addnum+"";
Message msg =newMessage();
msg.obj= s;
mHandler.sendMessage(msg);
}
for(intaddnum =0;addnum <3000;addnum++) {
String s = addnum+"";
Message msg =newMessage();
msg.obj= s;
mTextHandler.sendMessage(msg);
}
Log.d(TAG,"d is"+d);
newThread(newRunnable() {
@Override
public voidrun() {
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}).start();
sum = sum* b;
sum = sum *c;
sum = sum/b;
for(intaddnum =0;addnum <3000;addnum++) {
String s = addnum+"";
Message msg =newMessage();
msg.obj= s;
mHandler.sendMessage(msg);
}
for(intaddnum =0;addnum <3000;addnum++) {
String s = addnum+"";
Message msg =newMessage();
msg.obj= s;
mTextHandler.sendMessage(msg);
}
Log.d(TAG,"sum is "+sum);
newThread(newRunnable() {
@Override
public voidrun() {
try{
for(intaddnum =0;addnum <3000;addnum++) {
String s = addnum+"";
Message msg =newMessage();
msg.obj= s;
mTextHandler.sendMessage(msg);
}
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}).start();
for(intk =0; k<1000;k++){
floate =2.0f;
floatl =3.0f;
l = (float) (e*f/sum+l-e);
String s = k+"";
Message msg =newMessage();
msg.obj= s;
mHandler.sendMessage(msg);
sum = sum/e;
String s1 = k+"";
Message msg1 =newMessage();
msg.obj= s1;
mTextHandler.sendMessage(msg1);
}
for(intq =0; q<1000;q++){
floatw =2.0f;
floatt =3.0f;
floatr = (float) (w*f/sum);
sum = sum+t/w +r +r*w +t*w;
newThread(newRunnable() {
@Override
public voidrun() {
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}).start();
}
newThread(newRunnable() {
@Override
public voidrun() {
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}).start();
}
}
}
}).start();
}
}
xml文件如下:
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.demo.sleep.MainActivity">
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
android:id="@+id/text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
public classMainActivityextendsAppCompatActivity {
private Button mCPUButton;
private boolean bTestThread=true;
private boolean bFlag=true;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCPUButton= (Button)findViewById(R.id.cup_button);
mCPUButton.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View view) {
if(bFlag){
bFlag=false;
mCPUButton.setText("停止");
for(inti =0; i<100; i++)
cpuTest();
}else{
bFlag=true;
mCPUButton.setText("增加CPU压力");
bTestThread=false;
}
}
});
}
private voidcpuTest(){
newThread(newRunnable() {
public voidrun(){
while(bTestThread)
{
}
}
}).start();
}
}
参考链接
http://www.voidcn.com/article/p-bpnqjlyi-ck.html
http://blog.csdn.net/xiaobai20131118/article/details/50698448
http://www.itwendao.com/article/detail/343816.html