what's the frequency of the letter "д" in:
q: как измерить количество используемой памяти навеяно вот этим ответом. вдруг сообразил, что померить производительность программы я знаю как, а вот как определить, сколько ей требуется памяти - что-то у меня пробелы в образовании :)
перехватывать new и delete? сомнительно, не очень верится, что все будет работать только через эти операторы. 
словом, никто не подскажет, как все-таки лучше, надежнее и точнее всего это делать, причем желательно не извне, а из самой программы?
конкретнее - windows, использую visual c++ 2017.

a: для получения информации о памяти процесса есть несколько api, наиболее интересны из них:

*

*функция getprocessmemoryinfo

*счетчики производительности

*функция heapsummary
пример кода:
#include <windows.h>
#include <stdio.h>
#include <psapi.h>
#include "pdh.h"
#pragma comment( lib, "pdh.lib" )

long getprivateworkingset(const wchar_t* process) {

    pdh_hquery query;
    pdh_hcounter counter;
    pdh_fmt_countervalue counterval;
    const wchar_t* name = l"\\process(%s)\\working set - private";
    wchar_t buf[1024]=l"";
    swprintf_s(buf, 1024, name, process);

    pdhopenquery(null, null, &query);
    pdh_status res = pdhaddenglishcounter(query, buf, null, &counter);
    res = pdhcollectquerydata(query);       
    pdhgetformattedcountervalue(counter, pdh_fmt_long, null, &counterval);
    long ret = counterval.longvalue;
    pdhclosequery(query);

    return ret;
}

void printmemory() {
    
    process_memory_counters_ex pmc;
    getprocessmemoryinfo(getcurrentprocess(), (process_memory_counters*)&pmc, sizeof(pmc));
    printf("private committed memory: %u b\nworking set: %u b\n", (uint)pmc.privateusage, (uint)pmc.workingsetsize);

    printf("private working set: %u b\n", (uint)getprivateworkingset(l"program"));

    handle heaps[20];
    heap_summary hs;

    dword cheaps = getprocessheaps(20, heaps);

    for (dword i = 0; i < cheaps; i++) {
        memset(&hs, 0, sizeof(hs));
        hs.cb = sizeof(hs);
        if (heapsummary(heaps[i], 0, &hs) == false) printf("heapsummary failed");
        printf("heap #%u size: %u b\n", (uint)i, (uint)hs.cballocated);
    }
    printf("\n");
}

int main()
{
    //первый запуск нужен для прогрева, т.е чтобы инициализировать внутренние структуры api
    //(так как api счетчиков производительности сам выделяет память при первом запуске)
    printmemory();

    //второй запуск, соответственно, дает достоверные значения
    printmemory();

    getchar();
}

показатели, которые я здесь использую:
private committed memory (частная выделенная память) - объем виртуальной памяти процесса в состоянии mem_commit, принадлежащей исключительно этому процессу. состояние mem_commit значит, что под данную память выделено место в файле подкачки, а в физической памяти оно может быть либо выделено, либо нет. из данного значения исключена память, которая является разделяемой между разными процессами - отображенные на память файлы и загруженные dll, отсюда "private". звучит сложно, но по сути это и есть главный показатель, сколько процесс "жрет" памяти.
working set (рабочий набор) - общий объем физической памяти, выделенной процессу, в том числе разделяемой между несколькими процессами.
private working set (частный рабочий набор) - объем физической памяти, принадлежащей исключительно данному процессу. этот показатель более полезен, чем предыдущий, но получить его сложнее.
heap size - объем выделенной динамической памяти (помимо непосредственно выделенного нами через new, включает также то, что выделено внутренне библиотеками).
какой из этих показателей использовать, сильно зависит от ситуации. если речь о спортивном программировании и ограничении количества используемой памяти на решение задачи, интересен private committed memory. если же речь идет об оценке нагрузки на систему, важнее показатели физической памяти, так как она более дефицитна, чем место в файле подкачки.

user
There are 43 "д"s.
assistant