在工作中,我们可能经常会用到压力测试等循环执行执行发包的机制,为了防止目标机压力过大,必然需要一个限速逻辑来进行控制,之前在网上看了看,发现基本没有这方面的介绍,于是自己写了一个。 这段代码使用了已经大半年,基本能够满足各种限速的要求,其中的动态调整逻辑也能够保证对限速本身对cpu的消耗不会太大,希望对大家有所帮助。(ps:这段代码是在linux下使用的,当然只需要将获取时间的函数改一下,那么在windows下也可以使用的,如果有朋友改了记得通知我一下哦~~)
#include <sys/time.h>
#include <stdio.h>
#include <math.h>
#include <iostream>
struct timeval tpstart,tpend;
int timeuse;
gettimeofday(&tpstart,NULL);
int countPerSec=0;//计算请求数
int statCount;//统计用
int iMaxReqPerSec=100;//最大限速
int trueMaxReq=iMaxReqPerSec;//动态调整的判定大小
while(1)
{
//业务要做的事情,在下面这个函数里完成就可以了
DoSomeThing();
//下面都是控制速度
++countPerSec;
if(countPerSec<trueMaxReq)
{
continue;
}
gettimeofday(&tpend,NULL);
timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec;//微秒
if(timeuse<=1000000 )
{
if(countPerSec>=iMaxReqPerSec)
{
statCount=countPerSec;
usleep(1000000-timeuse);
gettimeofday(&tpstart,NULL);
countPerSec=0;
}
}
else
{
statCount=countPerSec*1000000/timeuse;
//动态调整
trueMaxReq=statCount;
gettimeofday(&tpstart,NULL);
countPerSec=0;
}
}
基本上对循环执行的限速逻辑就是这样了,如果大家觉得还有什么问题,欢迎指教。 版权所有,转载请注明出处。https://www.vimer.cn
评论
暂无评论