Index: src/Common/Stats/Time.cc
===================================================================
--- src/Common/Stats/Time.cc	(revision 4f979377af2a344828be095c82d2fd6fbd8ac976)
+++ src/Common/Stats/Time.cc	(revision 79eaeb7d2f415bedb0599880c26d345dd4696cd4)
@@ -31,4 +31,46 @@
 			Base::TreeTop top;
 
+			typedef  std::chrono::time_point<std::chrono::high_resolution_clock> point_t;
+			std::chrono::duration<double> total;
+			std::chrono::duration<double> parent;
+
+			point_t global_begin;
+
+			template<typename T>
+			static inline std::ostream & operator<<(std::ostream & os, const std::chrono::duration<T> & dd) {
+				auto d = std::chrono::duration_cast<std::chrono::milliseconds>(dd);
+				auto minutes = std::chrono::duration_cast<std::chrono::minutes>(d);
+				auto seconds = std::chrono::duration_cast<std::chrono::seconds>(d % std::chrono::minutes(1));
+				auto millis  = std::chrono::duration_cast<std::chrono::milliseconds>(d % std::chrono::seconds(1));
+
+				bool zmin = minutes == minutes.zero();
+				bool zsec = seconds == seconds.zero();
+				bool zmil = millis  == millis .zero();
+
+				if(!zmin) {
+					os << std::setw(4) << minutes.count() << "m";
+				} else {
+					os << std::string(5, ' ');
+				}
+
+				if(!zmin || !zsec) {
+					if(!zmin) os << std::setfill('0');
+					os << std::setw(2) << seconds.count() << "s";
+				} else {
+					os << std::string(3, ' ');
+				}
+				os << std::setfill(' ');
+
+				if(!zmin || !zsec || !zmil) {
+					if(!zmin || !zsec) os << std::setfill('0');
+					os << std::setw(3) << millis .count();
+				} else {
+					os << std::string(4, ' ');
+				}
+				os << std::setfill(' ');
+
+				return os;
+			}
+
 			class TimerNode : public Base::Tree<top> {
 			public:
@@ -45,5 +87,9 @@
 					assert(finished);
 					std::chrono::duration<double> diff = end - begin;
-					os << diff.count();
+					os << diff << " | ";
+					os << std::setw(7) << std::setprecision(0);
+					os << size_t(100.0 * diff.count() / total.count()) << "% | ";
+					os << std::setw(5) << std::setprecision(0);
+					os << size_t(100.0 * diff.count() / total.count()) << "% ";
 				}
 
@@ -63,5 +109,4 @@
 				bool finished = false;
 
-				typedef  std::chrono::time_point<std::chrono::high_resolution_clock> point_t;
 				point_t begin;
 				point_t end;
@@ -69,4 +114,8 @@
 
 			std::stack<TimerNode *> nodes;
+
+			void StartGlobal() {
+				global_begin = std::chrono::high_resolution_clock::now();
+			}
 
 			void StartBlock(const char * const name) {
@@ -88,4 +137,8 @@
 			void print() {
 				if(!top.head) return;
+				auto global_end = std::chrono::high_resolution_clock::now();
+				total = global_end - global_begin;
+				parent = total;
+
 				size_t nc = 0;
 				Base::ForAll(top, 0, [&](Base::TreeImpl * node, size_t level) {
@@ -93,11 +146,17 @@
 				});
 
+				size_t nct = nc + 37;
+				std::cerr << std::string(nct, '=') << std::endl;
 				const char * const title = "Timing Results";
-				size_t nct = nc + 14;
-				std::cerr << std::string(nct, '=') << std::endl;
 				std::cerr << std::string((nct - std::strlen(title)) / 2, ' ');
 				std::cerr << title << std::endl;
 				std::cerr << std::string(nct, '-') << std::endl;
-
+				std::cerr << "Location";
+				std::cerr << std::string(nc - (std::strlen("Location")), ' ');
+				std::cerr << " | ";
+				std::cerr << "       Time | ";
+				std::cerr << "% parent | ";
+				std::cerr << "% total |" << std::endl;
+				std::cerr << std::string(nct, '-') << std::endl;
 
 				Base::ForAll(top, 0, [&](Base::TreeImpl * node, size_t level) {
@@ -106,5 +165,4 @@
 					std::cerr << std::string(nc - ((level * 4) + std::strlen(node->name)), ' ');
 					std::cerr << " | ";
-					std::cerr << std::setw(9);
 					node->print(std::cerr);
 					std::cerr << " |";
@@ -113,4 +171,6 @@
 
 				std::cerr << std::string(nct, '-') << std::endl;
+				std::cerr << "Total " << total << std::endl;
+				std::cerr << std::string(nct, '-') << std::endl;
 			}
 #		endif
Index: src/Common/Stats/Time.h
===================================================================
--- src/Common/Stats/Time.h	(revision 4f979377af2a344828be095c82d2fd6fbd8ac976)
+++ src/Common/Stats/Time.h	(revision 79eaeb7d2f415bedb0599880c26d345dd4696cd4)
@@ -25,4 +25,6 @@
 	namespace Time {
 #		if defined(NO_TIME_STATISTICS)
+			inline void StartGlobal() {}
+
 			inline void StartBlock(const char * const) {}
 			inline void StopBlock() {}
@@ -38,4 +40,6 @@
 			inline void TimeBLock(const char *, func_t) {}
 #		else
+			void StartGlobal();
+
 			void StartBlock(const char * const name);
 			void StopBlock();
