windows系统下,包含Windows.h和Psapi.h即可调用api获取尖峰内存消耗等信息。
可以自己修改内存、时间等的记录单位。
用法是通过addCheckPoint函数,记录当前占用的内存和运行的时间。
数据会被记录在 timePoint memoryPoint; zhushi; 这三个vector变量中。
然后在程序结束以后,通过print2File函数将记录的信息输出到文件中。
print2File这个函数可以根据自己的需要进行一定的修改。
MemoryTimeCount mt_count;
mt_count.addCheckPoint("prepare");
mt_count.print2File(QString filename);
#include "memorytimecount.h"
MemoryTimeCount::MemoryTimeCount()
{
//需要记录的内容有 程序的起始时间
time=time.currentTime();
time.start();
PeakWorkingSetSize=0;
WorkingSetSize=0;
PeakPagefileUsage=0;
PagefileUsage=0;
PrivateUsage=0;
LogCurrentProcessMemoryInfo();
}
#ifndef MEMORYTIMECOUNT_H
#define MEMORYTIMECOUNT_H
#include<Windows.h>
#include<Psapi.h>
#pragma once
#pragma comment(lib,"Psapi.lib")
#include<iostream>
#include<QTime>
#include<QVector>
#include<QFile>
using namespace std;
class MemoryTimeCount
{
public:
QTime time;
int ini_time;
QVector<int> timePoint;
QVector<int> memoryPoint;
QVector<QString> zhushi;
void addCheckPoint(QString tmp)
{
zhushi.push_back(tmp);
setCheckCurrentState();
}
QString Note2String()
{
QString tmp="Notes\n";
for(int i=0;i<zhushi.size();i++)
{
tmp.append(zhushi[i]);
tmp.append("\t");
}
tmp.append("\n");
return tmp;
}
void setCheckCurrentState()
{
setCheckTime();
setCheckMemory();
}
void setCheckTime()
{
timePoint.push_back(time.elapsed()/1000);
}
void setCheckMemory()
{
memoryPoint.push_back(WorkingSetSize);
LogCurrentProcessMemoryInfo();
}
QString GetPeakMemoryAndTime2String()
{
QString temp=QString::number(PeakWorkingSetSize);
temp.append("\n");
if(timePoint[timePoint.size()>1])
{
temp.append(QString::number(timePoint[timePoint.size()-1]));
}
else
{
temp.append(QString::number(-1));
}
temp.append("\n");
return temp;
}
QString GetTime2String()
{
QString tmp="time point(s)\n";
for(int i=0;i<timePoint.size();i++)
{
QString num=QString::number(timePoint[i]);
tmp.append(num);
tmp.append("\t");
}
tmp.append("\n");
return tmp;
}
QString GetMemory2String()
{
QString tmp="Memory point(MB)\n";
for(int i=0;i<memoryPoint.size();i++)
{
QString num=QString::number(memoryPoint[i]);
tmp.append(num);
tmp.append("\t");
}
tmp.append("\n");
tmp.append("\nlatest MemorySize\n");
tmp.append("PeakWorkSetSize \t ").append(QString::number(PeakWorkingSetSize)).append("\n");
tmp.append("WorkingSetSize \t ").append(QString::number(WorkingSetSize )).append("\n");
tmp.append("PeakPagefileUsage \t ").append(QString::number(PeakPagefileUsage )).append("\n");
tmp.append("PagefileUsage \t ").append(QString::number(PagefileUsage )).append("\n");
tmp.append("PrivateUsage \t ").append(QString::number(PrivateUsage )).append("\n");
tmp.append("\n");
return tmp;
}
void print2File(QString filename)
{
//创建文件对象
QFile file;
//关联文件名字
file.setFileName(filename);
//打开文件,只写方式
bool isOK = file.open(QIODevice::WriteOnly);
if (isOK == true)
{
file.write(GetPeakMemoryAndTime2String().toUtf8().data());
file.write(Note2String().toUtf8().data());
file.write(GetTime2String().toUtf8().data());
file.write(GetMemory2String().toUtf8().data());
}
file.close();
}
//显示当前程序的内存使用情况
void LogCurrentProcessMemoryInfo()
{
HANDLE handle=GetCurrentProcess();
PROCESS_MEMORY_COUNTERS_EX pmc = {0};
// int a = sizeof(pmc);
if (!GetProcessMemoryInfo(handle,(PROCESS_MEMORY_COUNTERS*)&pmc,sizeof(pmc)))
{
return;
}
PeakWorkingSetSize=pmc.PagefileUsage/1024/1024;
WorkingSetSize=pmc.WorkingSetSize/1024/1024;
PeakPagefileUsage=pmc.PeakPagefileUsage/1024/1024;
PagefileUsage=pmc.PagefileUsage/1024/1024;
PrivateUsage=pmc.PrivateUsage/1024/1024;
}
MemoryTimeCount();
private:
long long PeakWorkingSetSize;
long long WorkingSetSize;
long long PeakPagefileUsage;
long long PagefileUsage;
long long PrivateUsage;
};
#endif // MEMORYTIMECOUNT_H
注意
这个头文件的顺序不能改变,否则有可能发生变异错误
#include<Windows.h>
#include<Psapi.h>
#pragma once
#pragma comment(lib,"Psapi.lib")