从自己的程序获取程序元数据

时间:2013-09-06 16:29:11

标签: c++ c file metadata system

如何为我的C程序变量带来以下值:

  • 用于执行程序的CPU,即在同一程序上花费了多少处理器。

  • 程序的执行时间,即完成所需的时间。

  • 编译器警告,即如何在我自己的程序中对字符串变量放置编译器警告?

  • 我的程序到磁盘的大小:程序花掉了我的硬盘。

我发现这很难做到,我不知道怎么做。

感谢所有提前

2 个答案:

答案 0 :(得分:0)

可执行文件的编译器警告是仅在构建程序后才可用的信息。所以我认为不可能将这些信息静态地打包到你的“C程序变量”中。

您可以将此数据另存为文件作为附加构建步骤。例如,编写一个执行编译器并读取其输出的程序。然后,该程序将数据保存到文件或为其提供链接器,并告诉它将其打包为ressource(但之后您将丢失链接器警告)。

大小,cpu使用和运行时间是程序在运行时可以获取的信息。您可以使用C库(fopen等)轻松获取文件的大小。可以通过在应用程序启动时启动计时器并在退出之前读取该计时器以获得总运行时间来获取运行时间。我认为对于cpu使用你必须要求操作系统(快速谷歌搜索windows让我this

答案 1 :(得分:0)

[已编辑包含程序执行时间,文件大小]

仅适用于Windows:以下是一些可用于获取您想要的内容的代码。此实现仅返回PeakWorkingSize,但我已经包含了一个注释的结构副本,其中包含您可以获得的所有值,只需稍作修改即可。如果你包含psapi.lib(windows SDK安装的一部分,可以自由下载here),这将编译和构建ANSI C

#include <windows.h>
#include <ansi_c.h>
#include <psapi.h>

time_t GetMemUsage(void);

int main(int argc, char *argv[])
{
    DWORD start, elapsed; // for program execution time
    size_t memory; //for cpu usage;
    DWORD  filesize=0; //for exe file size
    FILE *fp;
    char buf[260];
    int i;

    start = GetTickCount();

    sprintf(buf, ".\\%s", argv[0]);

    fp = fopen(buf, "r");

    filesize = GetFileSize(fp, NULL);

    for(i=0;i<1000000;i++); //so ticks will be more than zero

    memory = GetMemUsage();

    fclose(fp);

    elapsed = GetTickCount() - start; //note, possible rollover, 

    return 0;   
}

time_t GetMemUsage(void)
{
    HANDLE hProcess;
    PROCESS_MEMORY_COUNTERS pmc;
    DWORD processID = GetCurrentProcessId();

    hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION |
                                    PROCESS_VM_READ,
                                    FALSE, processID );
    GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc));
    CloseHandle(hProcess);

//  typedef struct _PROCESS_MEMORY_COUNTERS {
//      DWORD cb;
//      DWORD PageFaultCount;
//      SIZE_T PeakWorkingSetSize;
//      SIZE_T WorkingSetSize;
//      SIZE_T QuotaPeakPagedPoolUsage;                             
//      SIZE_T QuotaPagedPoolUsage;
//      SIZE_T QuotaPeakNonPagedPoolUsage;
//      SIZE_T QuotaNonPagedPoolUsage;
//      SIZE_T PagefileUsage;
//      SIZE_T PeakPagefileUsage;
//  } PROCESS_MEMORY_COUNTERS;

typedef PROCESS_MEMORY_COUNTERS *PPROCESS_MEMORY_COUNTERS;

    return pmc.PeakWorkingSetSize;
}