Skip to content

SystemVSM::GetMembership和SystemVSM::RefleshNodeID应该消除不必要的拷贝 #254

@dyx2025

Description

@dyx2025

SystemVSM::GetMembership和SystemVSM::RefleshNodeID应该消除不必要的拷贝

原代码路径:
src/config/system_v_sm.cpp

void SystemVSM :: GetMembership(NodeInfoList & vecNodeInfoList, uint64_t & llVersion)
{
    //must must get version first!
    llVersion = m_oSystemVariables.version();                                                                                                                                       

    for (int i = 0; i < m_oSystemVariables.membership_size(); i++)
    {   
        PaxosNodeInfo oNodeInfo = m_oSystemVariables.membership(i); // 不必要的拷贝

        NodeInfo tTmpNode(oNodeInfo.nodeid());
        vecNodeInfoList.push_back(tTmpNode); // 不必要的临时对象tTmpNode拷贝
    }   
}

// ...

void SystemVSM :: RefleshNodeID()
{
    m_setNodeID.clear();

    NodeInfoList vecNodeInfoList;
    
    for (int i = 0; i < m_oSystemVariables.membership_size(); i++)
    {
        PaxosNodeInfo oNodeInfo = m_oSystemVariables.membership(i); // 不必要的拷贝
        NodeInfo tTmpNode(oNodeInfo.nodeid());

        PLG1Head("ip %s port %d nodeid %lu", 
                tTmpNode.GetIP().c_str(), tTmpNode.GetPort(), tTmpNode.GetNodeID());

        m_setNodeID.insert(tTmpNode.GetNodeID());

        vecNodeInfoList.push_back(tTmpNode); // 不必要的临时对象tTmpNode拷贝
    }

    if (m_pMembershipChangeCallback != nullptr)
    {
        m_pMembershipChangeCallback(m_iMyGroupIdx, vecNodeInfoList);
    }
}

修改后的代码:
src/config/system_v_sm.cpp

void SystemVSM :: GetMembership(NodeInfoList & vecNodeInfoList, uint64_t & llVersion)
{
    //must must get version first!
    llVersion = m_oSystemVariables.version();                                                                                                                                       

    for (int i = 0; i < m_oSystemVariables.membership_size(); i++)
    {   
        // PaxosNodeInfo oNodeInfo = m_oSystemVariables.membership(i);
        const PaxosNodeInfo& oNodeInfo = m_oSystemVariables.membership(i);  // 避免拷贝

        /*
        NodeInfo tTmpNode(oNodeInfo.nodeid());
        vecNodeInfoList.push_back(tTmpNode);
        */
        vecNodeInfoList.emplace_back(oNodeInfo.nodeid()); // 原地构造,避免拷贝临时对象
    }   
}

// ...

void SystemVSM :: RefleshNodeID()
{
    m_setNodeID.clear();

    NodeInfoList vecNodeInfoList;
    
    for (int i = 0; i < m_oSystemVariables.membership_size(); i++)
    {
        //PaxosNodeInfo oNodeInfo = m_oSystemVariables.membership(i);
        const PaxosNodeInfo& oNodeInfo = m_oSystemVariables.membership(i); // 避免拷贝       

        /*
        NodeInfo tTmpNode(oNodeInfo.nodeid());

        PLG1Head("ip %s port %d nodeid %lu", 
                tTmpNode.GetIP().c_str(), tTmpNode.GetPort(), tTmpNode.GetNodeID());

        m_setNodeID.insert(tTmpNode.GetNodeID());

        vecNodeInfoList.push_back(tTmpNode);
        */
       
        m_setNodeID.insert(oNodeInfo.nodeid());

        vecNodeInfoList.emplace_back(oNodeInfo.nodeid()); // 原地构造,避免拷贝临时对象

        const NodeInfo& tTmpNode = vecNodeInfoList.back();
        PLG1Head("ip %s port %d nodeid %lu", 
                tTmpNode.GetIP().c_str(), tTmpNode.GetPort(), tTmpNode.GetNodeID());
        
    }

    if (m_pMembershipChangeCallback != nullptr)
    {
        m_pMembershipChangeCallback(m_iMyGroupIdx, vecNodeInfoList);
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions