Merge branch 'improve-stats' of https://github.com/cleverca22/nix
This commit is contained in:
		
						commit
						c4ba5f4be9
					
				
					 1 changed files with 63 additions and 26 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue