执行时间增加的原因是什么?

时间:2016-12-22 20:59:17

标签: c++ visual-studio c++11

我遇到的问题是每当我将超时变量uiMaxWaitMs从500更改为2000时,我的进程都会出现延迟。但是这只是一个超时值,并且实际上不应该增加我在select()函数调用中等待的时间。它只允许额外的时间允许超时。我的问题是,如果我从未在500毫秒或2000毫秒内达到超时,uiMaxWaitMS如何影响我的select()函数调用......

当我增加分配的超时值时,我的程序往往需要更长的时间才能通过TCP套接字发送命令......但是根据我的阅读,它应该只允许更长的时间 IF 但是因为我从未达到500毫秒超时的超时,为什么将超时值增加到2000毫秒会使我的性能变差?我知道结构变量的数学是奇怪的,并且对于微秒值(重构旧代码)来说是完全错误的

int CNPEnetConn::RecvByte (char *pcBuffer, unsigned int uiMaxWaitMs)
{
    fd_set oReadFds;
    struct timeval oTimeout;

    if(uiMaxWaitMs >= 1000)
        oTimeout.tv_sec = uiMaxWaitMs / 1000;
    else
        oTimeout.tv_sec = 1;

    oTimeout.tv_usec = uiMaxWaitMs;

    FD_ZERO (&oReadFds);
    FD_SET (m_hostSocket, &oReadFds);

    //----  wait for read ready, or timeout or error:
    //      (With Winsock, the only way to achieve a timeout is by using select)
    int iStatus = select (0, &oReadFds, NULL, NULL, &oTimeout);

    if (iStatus < 0)
    {
        return (WSAGetLastError());
    }
    else if (iStatus == 0)
    {
        return 0;
    }

    //----  receive waiting data:

    if (recv (m_hostSocket, pcBuffer, 1, 0) != 1)
    {
        return (WSAGetLastError());
    }

    return 1;
}

链接到信息select function

链接到信息timeout struct

500毫秒超时

AVG Time: 0.192142794019933
# Deltas > 0.5: 299
Min Time: 4.360000000360742E-4
Max Time: 1.013213000000178
Range Histogram: Total:1505
1.50:   0
1.25:   0
1.00:   14
0.75:   136
0.50:   149
0.25:   149
0.10:   1
0.00:   1056

2000ms超时

AVG Time: 0.9555644471726187
# Deltas > 0.5: 960
Min Time: 3.8500000005115E-4
Max Time: 1.96373100000028
Range Histogram: Total:1344
1.50:   384
1.25:   182
1.00:   10
0.75:   192
0.50:   192
0.25:   192
0.10:   0
0.00:   192

每2秒发送一条消息,时间表示创建消息并发送消息所需的时间。使用WireShark收集数据,并通过我创建的简单Java程序进行分析。

0 个答案:

没有答案