在工作中,我们可能经常会用到压力测试等循环执行执行发包的机制,为了防止目标机压力过大,必然需要一个限速逻辑来进行控制,之前在网上看了看,发现基本没有这方面的介绍,于是自己写了一个。
这段代码使用了已经大半年,基本能够满足各种限速的要求,其中的动态调整逻辑也能够保证对限速本身对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;
    }
}

基本上对循环执行的限速逻辑就是这样了,如果大家觉得还有什么问题,欢迎指教。

版权所有,转载请注明出处。http://www.vimer.cn

暂无相关产品

发表评论