| 52 | } |
| 53 | |
| 54 | double GetCurrentRSSInMB() { |
| 55 | #ifdef __APPLE__ |
| 56 | mach_task_basic_info info; |
| 57 | mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT; |
| 58 | if (task_info(mach_task_self(), MACH_TASK_BASIC_INFO, |
| 59 | reinterpret_cast<task_info_t>(&info), &count) != KERN_SUCCESS) { |
| 60 | return -1.0; |
| 61 | } |
| 62 | return static_cast<double>(info.resident_size) / (1024.0 * 1024.0); |
| 63 | #elif defined(__linux__) |
| 64 | long total_pages = 0; |
| 65 | long rss_pages = 0; |
| 66 | std::ifstream ifs("/proc/self/statm"); |
| 67 | if (!(ifs >> total_pages >> rss_pages)) { |
| 68 | return -1.0; |
| 69 | } |
| 70 | const long page_size = sysconf(_SC_PAGESIZE); |
| 71 | return static_cast<double>(rss_pages) * static_cast<double>(page_size) / (1024.0 * 1024.0); |
| 72 | #elif defined(_WIN32) |
| 73 | PROCESS_MEMORY_COUNTERS counters; |
| 74 | if (!GetProcessMemoryInfo(GetCurrentProcess(), &counters, sizeof(counters))) { |
| 75 | return -1.0; |
| 76 | } |
| 77 | return static_cast<double>(counters.WorkingSetSize) / (1024.0 * 1024.0); |
| 78 | #else |
| 79 | return -1.0; |
| 80 | #endif |
| 81 | } |
| 82 | |
| 83 | template <typename Func> |
| 84 | double MeasureMillis(Func func) { |