Index: /trunk/src/kmk/function.c
===================================================================
--- /trunk/src/kmk/function.c	(revision 2757)
+++ /trunk/src/kmk/function.c	(revision 2758)
@@ -2043,4 +2043,8 @@
       size_t off;
       const struct floc *reading_file_saved = reading_file;
+#ifdef CONFIG_WITH_MAKE_STATS
+      unsigned long long uStartTick = CURRENT_CLOCK_TICK();
+      MAKE_STATS_2(v->cEvalVals++);
+#endif
 
       /* Make a copy of the value to the variable buffer since
@@ -2068,4 +2072,6 @@
         pop_variable_scope ();
       restore_variable_buffer (buf, len);
+
+      MAKE_STATS_2(v->cTicksEvalVal += CURRENT_CLOCK_TICK() - uStartTick);
     }
 
Index: /trunk/src/kmk/main.c
===================================================================
--- /trunk/src/kmk/main.c	(revision 2757)
+++ /trunk/src/kmk/main.c	(revision 2758)
@@ -1368,4 +1368,7 @@
   PATH_VAR (current_directory);
   unsigned int restarts = 0;
+#ifdef CONFIG_WITH_MAKE_STATS
+  unsigned long long uStartTick = CURRENT_CLOCK_TICK();
+#endif
 #ifdef WINDOWS32
   char *unix_path = NULL;
@@ -2922,4 +2925,5 @@
              _("warning:  Clock skew detected.  Your build may be incomplete."));
 
+    MAKE_STATS_2(if (uStartTick) printf("main ticks elapsed: %ull\n", (unsigned long long)(CURRENT_CLOCK_TICK() - uStartTick)) );
     /* Exit.  */
     die (status);
Index: /trunk/src/kmk/make.h
===================================================================
--- /trunk/src/kmk/make.h	(revision 2757)
+++ /trunk/src/kmk/make.h	(revision 2758)
@@ -238,4 +238,11 @@
 
 /* bird - start */
+#ifdef _MSC_VER
+# include <intrin.h>
+# define CURRENT_CLOCK_TICK() __rdtsc()
+#else
+# define CURRENT_CLOCK_TICK() 0
+#endif
+
 #define COMMA ,
 #ifdef CONFIG_WITH_VALUE_LENGTH
Index: /trunk/src/kmk/variable.c
===================================================================
--- /trunk/src/kmk/variable.c	(revision 2757)
+++ /trunk/src/kmk/variable.c	(revision 2758)
@@ -448,4 +448,6 @@
   MAKE_STATS_2(v->reallocs = 0);
   MAKE_STATS_2(v->references = 0);
+  MAKE_STATS_2(v->cEvalVals = 0);
+  MAKE_STATS_2(v->cTicksEvalVal = 0);
 
   v->exportable = 1;
@@ -605,4 +607,7 @@
       MAKE_STATS_2(v->changes = 0);
       MAKE_STATS_2(v->reallocs = 0);
+      MAKE_STATS_2(v->references = 0);
+      MAKE_STATS_2(v->cEvalVals = 0);
+      MAKE_STATS_2(v->cTicksEvalVal = 0);
       v->exportable = 1;
       if (*name != '_' && (*name < 'A' || *name > 'Z')
@@ -894,5 +899,5 @@
       if (v != VAR_NOT_KBUILD_ACCESSOR)
         {
-          MAKE_STATS (v->references++);
+          MAKE_STATS_2 (v->references++);
           return v;
         }
@@ -929,6 +934,6 @@
           RESOLVE_ALIAS_VARIABLE(v);
 # endif
-         MAKE_STATS (v->references++);
-	  return v->special ? lookup_special_var (v) : v;
+          MAKE_STATS_2 (v->references++);
+	   return v->special ? lookup_special_var (v) : v;
         }
 
@@ -1032,5 +1037,5 @@
         {
           RESOLVE_ALIAS_VARIABLE(v);
-          MAKE_STATS (v->references++);
+          MAKE_STATS_2 (v->references++);
           return v;
         }
@@ -1060,5 +1065,5 @@
   RESOLVE_ALIAS_VARIABLE(v);
 # endif
-  MAKE_STATS (if (v) v->references++);
+  MAKE_STATS_2 (if (v) v->references++);
   return v;
 #endif /* CONFIG_WITH_STRCACHE2 */
@@ -2764,4 +2769,6 @@
 static unsigned long var_stats_reallocs, var_stats_realloced;
 static unsigned long var_stats_references, var_stats_referenced;
+static unsigned long var_stats_evalvals, var_stats_evalvaled;
+static uintmax_t var_stats_evalval_ticks;
 static unsigned long var_stats_val_len, var_stats_val_alloc_len;
 static unsigned long var_stats_val_rdonly_len;
@@ -2836,12 +2843,21 @@
   var_stats_changes += v->changes;
   var_stats_changed += (v->changes != 0);
+
   if (v->reallocs != 0)
       printf (_(", %u reallocs"), v->reallocs);
   var_stats_reallocs += v->reallocs;
   var_stats_realloced += (v->reallocs != 0);
+
   if (v->references != 0)
       printf (_(", %u references"), v->references);
   var_stats_references += v->references;
   var_stats_referenced += (v->references != 0);
+
+  if (v->cEvalVals != 0)
+      //printf (_(", %u evalvals (%llu ticks)"), v->cEvalVals, v->cTicksEvalVal);
+      printf (_(", %u evalvals (%llu ms)"), v->cEvalVals, v->cTicksEvalVal / 3299998);
+  var_stats_evalvals += v->cEvalVals;
+  var_stats_evalvaled += (v->cEvalVals != 0);
+
   var_stats_val_len += v->value_length;
   if (v->value_alloc_len)
Index: /trunk/src/kmk/variable.h
===================================================================
--- /trunk/src/kmk/variable.h	(revision 2757)
+++ /trunk/src/kmk/variable.h	(revision 2758)
@@ -113,4 +113,6 @@
     unsigned int reallocs;     /* Realloc on value count.  */
     unsigned int references;   /* Lookup count.  */
+    unsigned cEvalVals;        /* $(evalval v) or $(evalvalctx v) count */
+    unsigned long long cTicksEvalVal; /* Number of ticks spend in cEvalVal. */
 #endif
   };
