35 #include <sys/resource.h> 45 inline double getWallClockTime() {
48 return double(t.tv_sec) + double(t.tv_usec) / 1000000;
51 inline double getWallClockTime() {
53 GetSystemTimeAsFileTime(&t);
54 return double(t.dwHighDateTime) / 10 + double(t.dwLowDateTime) / 10000000;
58 struct ResourceUsage {
68 ResourceUsage(
double etime,
double utime,
double stime,
long maxrss) :
69 etime(etime), utime(utime), stime(stime), maxrss(maxrss) {
72 ResourceUsage& update() {
73 etime = getWallClockTime();
76 HANDLE h = GetCurrentProcess();
77 FILETIME ft_creat, ft_exit, ft_kernel, ft_user;
78 if (GetProcessTimes(h, &ft_creat, &ft_exit, &ft_kernel, &ft_user)) {
79 ULARGE_INTEGER ul_kernel, ul_user;
80 ul_kernel.LowPart = ft_kernel.dwLowDateTime;
81 ul_kernel.HighPart = ft_kernel.dwHighDateTime;
82 ul_user.LowPart = ft_user.dwLowDateTime;
83 ul_user.HighPart = ft_user.dwHighDateTime;
84 stime = ul_kernel.QuadPart * 1e-7;
85 utime = ul_user.QuadPart * 1e-7;
88 PROCESS_MEMORY_COUNTERS pmc;
89 if (GetProcessMemoryInfo(h, &pmc,
sizeof(pmc))) {
90 maxrss = pmc.WorkingSetSize / 1024;
94 getrusage(RUSAGE_SELF, &s);
95 utime = s.ru_utime.tv_sec + s.ru_utime.tv_usec * 1e-6;
96 stime = s.ru_stime.tv_sec + s.ru_stime.tv_usec * 1e-6;
106 ResourceUsage operator+(ResourceUsage
const& u)
const {
107 return ResourceUsage(etime + u.etime, utime + u.utime, stime + u.stime,
108 std::max(maxrss, u.maxrss));
111 ResourceUsage& operator+=(ResourceUsage
const& u) {
115 if (maxrss < u.maxrss) maxrss = u.maxrss;
119 ResourceUsage operator-(ResourceUsage
const& u)
const {
120 return ResourceUsage(etime - u.etime, utime - u.utime, stime - u.stime,
121 std::max(maxrss, u.maxrss));
124 ResourceUsage& operator-=(ResourceUsage
const& u) {
128 if (maxrss < u.maxrss) maxrss = u.maxrss;
132 std::string elapsedTime()
const {
133 std::stringstream ss;
134 ss << std::fixed << std::setprecision(2) << etime <<
"s";
138 std::string userTime()
const {
139 std::stringstream ss;
140 ss << std::fixed << std::setprecision(2) << utime <<
"s";
144 std::string memory()
const {
145 std::stringstream ss;
146 ss << std::fixed << std::setprecision(0) << maxrss / 1024.0 <<
"MB";
150 friend std::ostream& operator<<(std::ostream& os, ResourceUsage
const& u) {
151 std::ios_base::fmtflags backup = os.flags(std::ios::fixed);
152 os.setf(std::ios::fixed);
154 os << std::setprecision(2) << u.etime <<
"s elapsed, ";
155 os << std::setprecision(2) << u.utime <<
"s user, ";
156 os << std::setprecision(0) << u.maxrss / 1024.0 <<
"MB";
163 class ElapsedTimeCounter {
168 ElapsedTimeCounter() :
169 totalTime(0), startTime(0) {
172 ElapsedTimeCounter& reset() {
177 ElapsedTimeCounter& start() {
178 startTime = getWallClockTime();
182 ElapsedTimeCounter& stop() {
183 totalTime += getWallClockTime() - startTime;
187 operator double()
const {
191 friend std::ostream& operator<<(std::ostream& os,
192 ElapsedTimeCounter
const& o) {
193 std::ios_base::fmtflags backup = os.flags(std::ios::fixed);
194 os.setf(std::ios::fixed);
195 os << std::setprecision(2) << o.totalTime <<
"s";