《基于单层时间轮与无锁数组操控的容器化定时器协同管理方法》---测试报告

52 阅读1分钟

光说不练假把式先发测试报告。

1. 启动 6 个业务容器

for (std::uint16_t i = 1; i < 6; ++i) {

const auto pService = new (std::nothrow) CPerfTestTimerService;

if (SDP::CDispatcherCenterDemon::Instance()->RegisterTask(pService, CPerfTestTimerService::EN_SERVICE_TYPE, i, true)) {

SDP_RUN_LOG_ERROR("performance timer service register failed");

return -1;

}

}

2. 业务容器已启动创建 1000 万个定时器,每秒触发一次

CPerfTestTimerService::CPerfTestTimerService()

: m_nCount(0)

, m_vecMsTimerHandler(100000000)

, m_reportTimer()

{

}

std::int32_t CPerfTestTimerService::OnInit() {

SDP_FWD_CALL(SDP::CPollServiceReactor::OnInit());

this->SetAffinity();

m_lastTime = std::chrono::steady_clock::now();

for (auto& timer : m_vecMsTimerHandler) {

timer.m_pTestTimerService = this;

this->SetTimer(&timer, 1, 1);

}

m_reportTimer.m_pTestTimerService = this;

this->SetTimer(&m_reportTimer, 1, 1);

return 0;

}

3. 定时任务到,本容器统计计数 + 1

void CPerfTestTimerService::OnTimeout() {

++m_nCount;

}

4. 容器另创建一个汇报定时器,每秒触发一次

m_reportTimer.m_pTestTimerService = this;

this->SetTimer(&m_reportTimer, 1, 1);

5. 汇报定时到:将统计数据发送到统计容器。支持对象发送

void CPerfTestTimerService::OnReportTimeout() {

DEMO::CTimerSumMsg timerSumMsg;

timerSumMsg.m_nStatistics = m_nCount;

this->SendMsg(timerSumMsg);

m_nCount = 0;

}

6. 另起唯一的统计软件,接收每个测试容器统计汇报,汇总

void CDemoStaticService::OnSdpMsg(const CTimerSumMsg& rTimerSumMsg) {

m_nTimerStatistics += rTimerSumMsg.m_nStatistics;

}

// 统计容器起每秒触发定时器,定时时间到,打印总统计值

void CDemoStaticService::OnTimeout([[maybe_unused]] CStaticTimerHandler* pTestTimerHandler) {

++m_nSeconds;

m_fTotalTimerStatistics += static_cast<double>(m_nTimerStatistics);

std::printf("timer msg sum:%u, ---avg timer msg sum:%0.2f\n",

m_nTimerStatistics, m_fTotalTimerStatistics / static_cast<double>(m_nSeconds));

m_nTimerStatistics = 0;

}

7. 性能相关说明

​编辑看右面统计值,每个容器 CPU 占有率 10% 左右,内存占用了 12.5% 的物理内存,启用内存池,虚拟内存较大 3.9g