Vaa3D_内存、运行时间统计_windows

20 篇文章 0 订阅

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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值