像我这样不能算真正的研究算法的人,但是我的工作中永远都不能丢掉算法库这个东东。
因为我们研究开发出图像算法库,总是被人问到性能如何?做了这么久,不过是人家产品上一个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
不过,这样计算出来的内存,会比任务管理器显示出来的内存增量会多些,不知道为什么。。。。