Index: src/Common/Heap.cc
===================================================================
--- src/Common/Heap.cc	(revision ecaeac6ed89a6845eb3b5cd67b27d8fe12736440)
+++ src/Common/Heap.cc	(revision a96691dac77d68e19d483fa223d61b511ccf38c0)
@@ -46,23 +46,53 @@
 		}
 
+		void print(size_t value, size_t total) {
+			std::cerr << std::setw(12) << value;
+			std::cerr << "(" << std::setw(3);
+			std::cerr << (value == 0 ? 0 : value * 100 / total);
+			std::cerr << "%) | ";
+		}
+
+		void print(const StatBlock& stat, size_t nc, size_t total_mallocs, size_t total_frees) {
+			std::cerr << std::setw(nc) << stat.name;
+			std::cerr << " | ";
+
+			print(stat.mallocs, total_mallocs);
+			print(stat.frees  , total_frees  );
+			std::cerr << "\n";
+		}
+
+		void print(char c, size_t nc) {
+			for(size_t i = 0; i < nc; i++) {
+				std::cerr << c;
+			}
+			std::cerr << '\n';
+		}
+
 		void printStats() {
 			size_t nc = 0;
+			size_t total_mallocs = 0;
+			size_t total_frees   = 0;
 			for(size_t i = 0; i < passes_cnt; i++) {
 				nc = std::max(nc, std::strlen(passes[i].name));
+				total_mallocs += passes[i].mallocs;
+				total_frees   += passes[i].frees;
 			}
+			size_t nct = nc + 44;
 
 			const char * const title = "Heap Usage Statistic";
-			for(size_t i = 0; i < (nc + 30); i++) std::cerr << '='; std::cerr << '\n';
-			for(size_t i = 0; i < (nc + 30 - std::strlen(title)) / 2; i++) std::cerr << ' ';
+			print('=', nct);
+			for(size_t i = 0; i < (nct - std::strlen(title)) / 2; i++) std::cerr << ' ';
 			std::cerr << title << std::endl;
-			for(size_t i = 0; i < (nc + 30); i++) std::cerr << '-'; std::cerr << '\n';
+			print('-', nct);
 			std::cerr << std::setw(nc) << "Pass";
-			std::cerr << " | Malloc Count |   Free Count" << std::endl;
-			for(size_t i = 0; i < (nc + 30); i++) std::cerr << '-'; std::cerr << '\n';
+			std::cerr << " |       Malloc Count |         Free Count |" << std::endl;
+
+			print('-', nct);
 			for(size_t i = 0; i < passes_cnt; i++) {
-				std::cerr << std::setw(nc) << passes[i].name    << " | ";
-				std::cerr << std::setw(12) << passes[i].mallocs << " | ";
-				std::cerr << std::setw(12) << passes[i].frees   << "\n";
+				print(passes[i], nc, total_mallocs, total_frees);
 			}
+			print('-', nct);
+			print({"Sum", total_mallocs, total_frees}, nc, total_mallocs, total_frees);
+
 		}
 	#endif
