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);
}
}
SystemVSM::GetMembership和SystemVSM::RefleshNodeID应该消除不必要的拷贝
原代码路径:
src/config/system_v_sm.cpp
修改后的代码:
src/config/system_v_sm.cpp