消除AcceptorState::Load不必要的拷贝
AcceptorState::Load的m_sAcceptedValue可以通过移动oState的acceptednodeid,减少不必要的拷贝。#214 的测试数据支持这一做法。
原代码路径:
src/algorithm/acceptor.cpp
int AcceptorState :: Load(uint64_t & llInstanceID)
{
int ret = m_oPaxosLog.GetMaxInstanceIDFromLog(m_poConfig->GetMyGroupIdx(), llInstanceID);
if (ret != 0 && ret != 1)
{
PLGErr("Load max instance id fail, ret %d", ret);
return ret;
}
if (ret == 1)
{
PLGErr("empty database");
llInstanceID = 0;
return 0;
}
AcceptorStateData oState;
ret = m_oPaxosLog.ReadState(m_poConfig->GetMyGroupIdx(), llInstanceID, oState);
if (ret != 0)
{
return ret;
}
m_oPromiseBallot.m_llProposalID = oState.promiseid();
m_oPromiseBallot.m_llNodeID = oState.promisenodeid();
m_oAcceptedBallot.m_llProposalID = oState.acceptedid();
m_oAcceptedBallot.m_llNodeID = oState.acceptednodeid();
m_sAcceptedValue = oState.acceptedvalue(); // 赋值,产生字符串拷贝
m_iChecksum = oState.checksum();
PLGImp("GroupIdx %d InstanceID %lu PromiseID %lu PromiseNodeID %lu"
" AccectpedID %lu AcceptedNodeID %lu ValueLen %zu Checksum %u",
m_poConfig->GetMyGroupIdx(), llInstanceID, m_oPromiseBallot.m_llProposalID,
m_oPromiseBallot.m_llNodeID, m_oAcceptedBallot.m_llProposalID,
m_oAcceptedBallot.m_llNodeID, m_sAcceptedValue.size(), m_iChecksum);
return 0;
}
修改后的代码路径:
src/algorithm/acceptor.cpp
int AcceptorState :: Load(uint64_t & llInstanceID)
{
int ret = m_oPaxosLog.GetMaxInstanceIDFromLog(m_poConfig->GetMyGroupIdx(), llInstanceID);
if (ret != 0 && ret != 1)
{
PLGErr("Load max instance id fail, ret %d", ret);
return ret;
}
if (ret == 1)
{
PLGErr("empty database");
llInstanceID = 0;
return 0;
}
AcceptorStateData oState;
ret = m_oPaxosLog.ReadState(m_poConfig->GetMyGroupIdx(), llInstanceID, oState);
if (ret != 0)
{
return ret;
}
m_oPromiseBallot.m_llProposalID = oState.promiseid();
m_oPromiseBallot.m_llNodeID = oState.promisenodeid();
m_oAcceptedBallot.m_llProposalID = oState.acceptedid();
m_oAcceptedBallot.m_llNodeID = oState.acceptednodeid();
// 修改代码
// m_sAcceptedValue = oState.acceptedvalue();
m_sAcceptedValue = std::move(*(oState.mutable_acceptedvalue()));
m_iChecksum = oState.checksum();
PLGImp("GroupIdx %d InstanceID %lu PromiseID %lu PromiseNodeID %lu"
" AccectpedID %lu AcceptedNodeID %lu ValueLen %zu Checksum %u",
m_poConfig->GetMyGroupIdx(), llInstanceID, m_oPromiseBallot.m_llProposalID,
m_oPromiseBallot.m_llNodeID, m_oAcceptedBallot.m_llProposalID,
m_oAcceptedBallot.m_llNodeID, m_sAcceptedValue.size(), m_iChecksum);
return 0;
}
消除AcceptorState::Load不必要的拷贝
AcceptorState::Load的m_sAcceptedValue可以通过移动oState的acceptednodeid,减少不必要的拷贝。#214 的测试数据支持这一做法。
原代码路径:
src/algorithm/acceptor.cpp
修改后的代码路径:
src/algorithm/acceptor.cpp