提高CPU占用率

需要实现提高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

你可能感兴趣的:(提高CPU占用率)