破坏测试工具——CPU压力
Posted 搜狗测试
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了破坏测试工具——CPU压力相关的知识,希望对你有一定的参考价值。
前言
小编所在的项目组前段时间出现了一个BUG,键盘在一定的情况下会持续进行app间的跳转,定位原因后发现,该问题是因为机器性能较差,且机器CPU资源已消耗过大,导致键盘与App间的通讯一直失败,因此就出现了无休止的跳转,借由此事,小编便开始想要制作一个工具去抢占手机中的部分资源,让自己的app处在一个高压力的状态下运行并进行测试工作。
思考
说起资源的抢占,那首先就是CPU压力测试,那么我们该如何去做呢?
众所周知,CPU压力即是CPU占用与休息的时间占比,那我们这边要做的工具必然就需要进行精确的计算,确保CPU增加的数值符合预期。之前在网上找了一些别人写的代码,基本都是把一些耗时的计算放入CPU中进行死循环执行,之后再休息短暂的时间进行进行运算,虽然这给小编提供了思路但是并不满足此处的需求,由于小编需要在不同的手机上进行测试,所以希望CPU占用都能保持一致,而不是在性能好的手机上CPU压力低,在性能差的手机上CPU压力高。
解决方案
于是小编依靠时间来控制CPU压力,也就是说当10%CPU压力时,CPU会在1个单位时间内满负荷运算,在之后9个单位时间内进入休息状态,因为CPU的时间片段比较精细,所以我们选择的时间计算函数也是在C中非常精细的统计函数,具体代码如下:
由于代码是在ios上进行测试的,所以仅供参考
//首先是cpu运算的函数
void func() {
sqrt(rand());//进行开方运算
}
//建立获取基准时间
static inline uint64_t nanos_to_abs(uint64_t nanos) {
return nanos * timebase_info.denom / timebase_info.numer;
}
//在本函数中,大家可以根据需要去将CPU压力分配到多个线程中
void cpu_stress_threads(double percentage, int thread_count) {
for (int i = 0; i < thread_count; i++) {
cpu_stress(percentage/thread_count);
}
}
//CPU加压函数
void cpu_stress(double percentage) {//我们首先传入希望达到的CPU占比
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
mach_timebase_info(&timebase_info);//基准时间校准
});
dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue2, ^{//开辟线程执行加压动作
uint64_t bias = 0;
while (true) {//死循环持续加压,这里大家可以自行添加停止的时机
uint64_t t1, t2, t3, t, delay;
t1 = mach_absolute_time();
uint64_t sliceEnd = t1 + nanos_to_abs(1e7);//一个时间片为10ms
do {
//占用cpu的函数
func();
t2 = mach_absolute_time();
}
while(t2 < sliceEnd);//执行10ms的CPU持续运行
t = t2 - t1;
delay = t * ( 1.0 / percentage - 1.0);
delay -= bias;
mach_wait_until(mach_absolute_time() + delay);//执行对应比例的CPU休息时间
t3 = mach_absolute_time();
bias = (t3 - t2) - delay;//将代码执行的时间损耗计入休息时间
}
});
}
总结
以上就是小编制作的CPU压力测试工具,如果大家需要让此APP在后台运行只需要使其增加后台播放音乐的权限,并每隔一段时间播放一个音频文件即可,由于小编是输入法项目组的所以并不需要做这么多的工作,大家自行查找资料很容易就能做出来的。至此,本次的CPU压力测试就介绍到这里。
以上是关于破坏测试工具——CPU压力的主要内容,如果未能解决你的问题,请参考以下文章