算法库使用内存情况监测-使用GetProcessMemoryInfo()

像我这样不能算真正的研究算法的人,但是我的工作中永远都不能丢掉算法库这个东东。

因为我们研究开发出图像算法库,总是被人问到性能如何?做了这么久,不过是人家产品上一个button. 自己竟然如此伤感起来啦。。。

言归正传,通常,我们测试算法库内存情况。大致有两种方式,一,代码里sizeof()出所有new的内存,这种方法,我觉得最笨,通常不被采用,只能作为辅助手段。

二,运行算法库的时候,查看window task manager,就是我们大家长用的任务管理器。看看内存在运行算法的时候,增长如何。。。


但是,前一段查算法库内存时候,因为算法是fast registration,运行时间很短,没有切换到任务管理器窗口,算法库就运行完毕,来不及看到内存增长情况。

查了一圈,也有给出工具。

最终解决方案是,使用windows的读取memory使用情况的函数。

BOOL WINAPI GetProcessMemoryInfo(
  __in          HANDLE Process,
  __out         PPROCESS_MEMORY_COUNTERS ppsmemCounters,
  __in          DWORD cb
);

利用 memory 调用算法前当前内存使用情况,读取内存大小,然后在运行算法后,读取内存使用的峰值,相减便可以理解为算法使用的情况。这样直接写文件就达到自动获得算法库内存使用情况。

例如:

#ifdef _MYPERFORMANCE
				//CCalcPerformance calcTimer;	
				m_calcTimer.start();
				PROCESS_MEMORY_COUNTERS pmc;  
				long memsize1;
				long memsize2;
				if(GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)))  
				{  
					memsize1 = pmc.WorkingSetSize;  
					long pagsize = pmc.PagefileUsage; 					
				}


#endif	


				ICTFastRegLib *pCTReg = new CTMCCTFastRegLib();
				if(pCTReg->CTFastRegstration(m_pReferenceData,m_pFloatingData,m_nReferenceSize[0],m_nReferenceSize[1],m_nReferenceSize[2],dRefResolution
					,m_nFloatingSize[0],m_nFloatingSize[1],m_nFloatingSize[2],dMovResolution,pdMatrix,offset) != 0)
				{
					//error
					memset(pdMatrix,0,sizeof(double)*9);
					memset(offset,0,sizeof(double)*3);
					pdMatrix[0]= 1;
					pdMatrix[4] = 1;
					pdMatrix[8] = 1;
					fastRegresult = -1; 
					 error.Low(hr,"Failed to do CT-CT registration");
					 m_aborter.Abort();
					 return false;
				}
				else
				{
					fastRegresult = 0;
				}

			
#ifdef _MYPERFORMANCE
				m_calcTimer.end();
				double dTimer = m_calcTimer.calcTime();
				mylog = CMyLog::GetInstance(m_strLogPath);
				mylog->WriteLog("the ct-ct fast registration time: "+mylog->Doulbe2String(dTimer));

				
				if(GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)))  
				{  
					 memsize2 = pmc.PeakWorkingSetSize ;
					long pagsize = pmc.PagefileUsage;  
				}
				mylog->WriteLog("memory: "+mylog->Doulbe2String((memsize2-memsize1)/1024/1024));
				CloseHandle(GetCurrentProcess());

#endif				

不过,这样计算出来的内存,会比任务管理器显示出来的内存增量会多些,不知道为什么。。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值