+ if (getrusage(RUSAGE_SELF, &RU)) {
+ perror("getrusage call failed: -time-passes info incorrect!");
+ }
+
+ TimeRecord Result;
+ Result.Elapsed = T.tv_sec + T.tv_usec/1000000.0;
+ Result.UserTime = RU.ru_utime.tv_sec + RU.ru_utime.tv_usec/1000000.0;
+ Result.SystemTime = RU.ru_stime.tv_sec + RU.ru_stime.tv_usec/1000000.0;
+ Result.MaxRSS = RU.ru_maxrss*PageSize;
+
+ return Result;
+}
+
+void TimeRecord::passStart(const TimeRecord &T) {
+ Elapsed -= T.Elapsed;
+ UserTime -= T.UserTime;
+ SystemTime -= T.SystemTime;
+ RSSTemp = T.MaxRSS;
+}
+
+void TimeRecord::passEnd(const TimeRecord &T) {
+ Elapsed += T.Elapsed;
+ UserTime += T.UserTime;
+ SystemTime += T.SystemTime;
+ RSSTemp = T.MaxRSS - RSSTemp;
+ MaxRSS = std::max(MaxRSS, RSSTemp);
+}
+
+void TimeRecord::print(const char *PassName, const TimeRecord &Total) const {
+ fprintf(stderr,
+ " %7.4f (%5.1f%%) %7.4f (%5.1f%%) %7.4f (%5.1f%%) %7.4f (%5.1f%%) ",
+ UserTime , UserTime *100/Total.UserTime,
+ SystemTime, SystemTime*100/Total.SystemTime,
+ UserTime+SystemTime, (UserTime+SystemTime)*100/(Total.UserTime+Total.SystemTime),
+ Elapsed , Elapsed *100/Total.Elapsed);
+
+ if (Total.MaxRSS)
+ std::cerr << MaxRSS << "\t";
+ std::cerr << PassName << "\n";