15_服务器端优化

使用alt+f2打开性能分析,查看哪个部分所占用的cpu最高,进行代码优化。

image-20240329194711618

这是视频上的性能分析

15.1

这个是我电脑的性能分析

fd_set fdRead;//描述符(socket) 集合
            //清理集合
            FD_ZERO(&fdRead);
            if (_clients_change)   //判断set是否改变,未改变就用bak,否则就更新
            {
                _clients_change = false;    //更新之后,改变flag
                //将描述符(socket)加入集合
                _maxSock = _clients.begin()->second->sockfd();    
                for (auto iter : _clients)
                {
                    FD_SET(iter.second->sockfd(), &fdRead);
                    if (_maxSock < iter.second->sockfd())
                    {
                        _maxSock = iter.second->sockfd();
                    }
                }
                memcpy(&_fdRead_bak, &fdRead, sizeof(fd_set));
            }
            else {
                memcpy(&fdRead, &_fdRead_bak, sizeof(fd_set));
            }

            ///nfds 是一个整数值 是指fd_set集合中所有描述符(socket)的范围,而不是数量
            ///既是所有文件描述符最大值+1 在Windows中这个参数可以写0
            int ret = select(_maxSock + 1, &fdRead, nullptr, nullptr, nullptr);
            if (ret < 0)
            {
                printf("select任务结束。\n");
                Close();
                return false;
            }
            else if (ret == 0)
            {
                continue;
            }

#ifdef _WIN32
            for (int n = 0; n < fdRead.fd_count; n++)
            {
                auto iter  = _clients.find(fdRead.fd_array[n]);
                if (iter != _clients.end())
                {
                    if (-1 == RecvData(iter->second))
                    {
                        if (_pNetEvent)
                            _pNetEvent->OnNetLeave(iter->second);
                        _clients_change = true;
                        _clients.erase(iter->first);
                    }
                }else {
                    printf("error. if (iter != _clients.end())\n");
                }

            }
#else
            std::vector<ClientSocket*> temp;
            for (auto iter : _clients)
            {
                if (FD_ISSET(iter.second->sockfd(), &fdRead))
                {
                    if (-1 == RecvData(iter.second))
                    {
                        if (_pNetEvent)
                            _pNetEvent->OnNetLeave(iter.second);
                        _clients_change = false;
                        temp.push_back(iter.second);
                    }
                }
            }
            for (auto pClient : temp)
            {
                _clients.erase(pClient->sockfd());
                delete pClient;
            }
#endif

修改后的客户端加入模块和客户端退出模块。

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top