Merge branch 'improve-stats' of https://github.com/cleverca22/nix
This commit is contained in:
commit
c4ba5f4be9
|
@ -6,12 +6,15 @@
|
||||||
#include "globals.hh"
|
#include "globals.hh"
|
||||||
#include "eval-inline.hh"
|
#include "eval-inline.hh"
|
||||||
#include "download.hh"
|
#include "download.hh"
|
||||||
|
#include "json.hh"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
|
@ -23,6 +26,7 @@
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
using std::cout;
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
@ -1723,12 +1727,10 @@ bool EvalState::eqValues(Value & v1, Value & v2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void EvalState::printStats()
|
void EvalState::printStats()
|
||||||
{
|
{
|
||||||
bool showStats = getEnv("NIX_SHOW_STATS", "0") != "0";
|
bool showStats = getEnv("NIX_SHOW_STATS", "0") != "0";
|
||||||
Verbosity v = showStats ? lvlInfo : lvlDebug;
|
Verbosity v = showStats ? lvlInfo : lvlDebug;
|
||||||
printMsg(v, "evaluation statistics:");
|
|
||||||
|
|
||||||
struct rusage buf;
|
struct rusage buf;
|
||||||
getrusage(RUSAGE_SELF, &buf);
|
getrusage(RUSAGE_SELF, &buf);
|
||||||
|
@ -1739,34 +1741,69 @@ void EvalState::printStats()
|
||||||
uint64_t bValues = nrValues * sizeof(Value);
|
uint64_t bValues = nrValues * sizeof(Value);
|
||||||
uint64_t bAttrsets = nrAttrsets * sizeof(Bindings) + nrAttrsInAttrsets * sizeof(Attr);
|
uint64_t bAttrsets = nrAttrsets * sizeof(Bindings) + nrAttrsInAttrsets * sizeof(Attr);
|
||||||
|
|
||||||
printMsg(v, format(" time elapsed: %1%") % cpuTime);
|
|
||||||
printMsg(v, format(" size of a value: %1%") % sizeof(Value));
|
|
||||||
printMsg(v, format(" size of an attr: %1%") % sizeof(Attr));
|
|
||||||
printMsg(v, format(" environments allocated count: %1%") % nrEnvs);
|
|
||||||
printMsg(v, format(" environments allocated bytes: %1%") % bEnvs);
|
|
||||||
printMsg(v, format(" list elements count: %1%") % nrListElems);
|
|
||||||
printMsg(v, format(" list elements bytes: %1%") % bLists);
|
|
||||||
printMsg(v, format(" list concatenations: %1%") % nrListConcats);
|
|
||||||
printMsg(v, format(" values allocated count: %1%") % nrValues);
|
|
||||||
printMsg(v, format(" values allocated bytes: %1%") % bValues);
|
|
||||||
printMsg(v, format(" sets allocated: %1% (%2% bytes)") % nrAttrsets % bAttrsets);
|
|
||||||
printMsg(v, format(" right-biased unions: %1%") % nrOpUpdates);
|
|
||||||
printMsg(v, format(" values copied in right-biased unions: %1%") % nrOpUpdateValuesCopied);
|
|
||||||
printMsg(v, format(" symbols in symbol table: %1%") % symbols.size());
|
|
||||||
printMsg(v, format(" size of symbol table: %1%") % symbols.totalSize());
|
|
||||||
printMsg(v, format(" number of thunks: %1%") % nrThunks);
|
|
||||||
printMsg(v, format(" number of thunks avoided: %1%") % nrAvoided);
|
|
||||||
printMsg(v, format(" number of attr lookups: %1%") % nrLookups);
|
|
||||||
printMsg(v, format(" number of primop calls: %1%") % nrPrimOpCalls);
|
|
||||||
printMsg(v, format(" number of function calls: %1%") % nrFunctionCalls);
|
|
||||||
printMsg(v, format(" total allocations: %1% bytes") % (bEnvs + bLists + bValues + bAttrsets));
|
|
||||||
|
|
||||||
#if HAVE_BOEHMGC
|
#if HAVE_BOEHMGC
|
||||||
GC_word heapSize, totalBytes;
|
GC_word heapSize, totalBytes;
|
||||||
GC_get_heap_usage_safe(&heapSize, 0, 0, 0, &totalBytes);
|
GC_get_heap_usage_safe(&heapSize, 0, 0, 0, &totalBytes);
|
||||||
printMsg(v, format(" current Boehm heap size: %1% bytes") % heapSize);
|
|
||||||
printMsg(v, format(" total Boehm heap allocations: %1% bytes") % totalBytes);
|
|
||||||
#endif
|
#endif
|
||||||
|
if (showStats) {
|
||||||
|
printMsg(v, "evaluation statistics:");
|
||||||
|
auto outPath = getEnv("NIX_SHOW_STATS_PATH","-");
|
||||||
|
std::fstream fs;
|
||||||
|
if (outPath != "-") {
|
||||||
|
fs.open(outPath, std::fstream::out);
|
||||||
|
printMsg(v, format(" written to: %1%") % outPath);
|
||||||
|
}
|
||||||
|
JSONObject topObj(outPath == "-" ? cout : fs, true);
|
||||||
|
topObj.attr("cpuTime",cpuTime);
|
||||||
|
{
|
||||||
|
auto envs = topObj.object("envs");
|
||||||
|
envs.attr("number", nrEnvs);
|
||||||
|
envs.attr("elements", nrValuesInEnvs);
|
||||||
|
envs.attr("bytes", bEnvs);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto lists = topObj.object("list");
|
||||||
|
lists.attr("elements", nrListElems);
|
||||||
|
lists.attr("bytes", bLists);
|
||||||
|
lists.attr("concats", nrListConcats);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto values = topObj.object("values");
|
||||||
|
values.attr("number", nrValues);
|
||||||
|
values.attr("bytes", bValues);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto syms = topObj.object("symbols");
|
||||||
|
syms.attr("number", symbols.size());
|
||||||
|
syms.attr("bytes", symbols.totalSize());
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto sets = topObj.object("sets");
|
||||||
|
sets.attr("number", nrAttrsets);
|
||||||
|
sets.attr("bytes", bAttrsets);
|
||||||
|
sets.attr("elements", nrAttrsInAttrsets);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
JSONObject sizes = topObj.object("sizes");
|
||||||
|
sizes.attr("Env", sizeof(Env));
|
||||||
|
sizes.attr("Value", sizeof(Value));
|
||||||
|
sizes.attr("Bindings", sizeof(Bindings));
|
||||||
|
sizes.attr("Attr", sizeof(Attr));
|
||||||
|
}
|
||||||
|
topObj.attr("nrOpUpdates", nrOpUpdates);
|
||||||
|
topObj.attr("nrOpUpdateValuesCopied", nrOpUpdateValuesCopied);
|
||||||
|
topObj.attr("nrThunks", nrThunks);
|
||||||
|
topObj.attr("nrAvoided", nrAvoided);
|
||||||
|
topObj.attr("nrLookups", nrLookups);
|
||||||
|
topObj.attr("nrPrimOpCalls", nrPrimOpCalls);
|
||||||
|
topObj.attr("nrFunctionCalls", nrFunctionCalls);
|
||||||
|
#if HAVE_BOEHMGC
|
||||||
|
JSONObject gc = topObj.object("gc");
|
||||||
|
gc.attr("heapSize", heapSize);
|
||||||
|
gc.attr("totalBytes", totalBytes);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (countCalls) {
|
if (countCalls) {
|
||||||
v = lvlInfo;
|
v = lvlInfo;
|
||||||
|
|
Loading…
Reference in a new issue