Add some basic profiling support to the evaluator
Setting the environment variable NIX_COUNT_CALLS to 1 enables some
basic profiling in the evaluator.  It will count calls to functions
and primops as well as evaluations of attributes.
For example, to see where evaluation of a NixOS configuration spends
its time:
$ NIX_SHOW_STATS=1 NIX_COUNT_CALLS=1 ./src/nix-instantiate/nix-instantiate '<nixos>' -A system --readonly-mode
...
calls to 39 primops:
    239532 head
    233962 tail
    191252 hasAttr
...
calls to 1595 functions:
    224157 `/nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs/pkgs/lib/lists.nix:17:19'
    221767 `/nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs/pkgs/lib/lists.nix:17:14'
    221767 `/nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs/pkgs/lib/lists.nix:17:10'
...
evaluations of 7088 attributes:
    167377 undefined position
    132459 `/nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs/pkgs/lib/attrsets.nix:119:41'
     47322 `/nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs/pkgs/lib/attrsets.nix:13:21'
...
			
			
This commit is contained in:
		
							parent
							
								
									325d1cfebf
								
							
						
					
					
						commit
						e82767910c
					
				
					 5 changed files with 65 additions and 4 deletions
				
			
		|  | @ -713,7 +713,7 @@ static void prim_attrNames(EvalState & state, Value * * args, Value & v) | |||
| 
 | ||||
| 
 | ||||
| /* Dynamic version of the `.' operator. */ | ||||
| static void prim_getAttr(EvalState & state, Value * * args, Value & v) | ||||
| void prim_getAttr(EvalState & state, Value * * args, Value & v) | ||||
| { | ||||
|     string attr = state.forceStringNoCtx(*args[0]); | ||||
|     state.forceAttrs(*args[1]); | ||||
|  | @ -722,6 +722,7 @@ static void prim_getAttr(EvalState & state, Value * * args, Value & v) | |||
|     if (i == args[1]->attrs->end()) | ||||
|         throw EvalError(format("attribute `%1%' missing") % attr); | ||||
|     // !!! add to stack trace?
 | ||||
|     if (state.countCalls && i->pos) state.attrSelects[*i->pos]++; | ||||
|     state.forceValue(*i->value); | ||||
|     v = *i->value; | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue