将 getrusage 从 linux 转换为 windows
Posted
技术标签:
【中文标题】将 getrusage 从 linux 转换为 windows【英文标题】:converting getrusage from linux to windows 【发布时间】:2020-06-07 20:40:26 【问题描述】:我正在将一个 linux C++ 代码转换为 Windows,我正在努力替换这个 getrusage
方法。
1. timeval CPUStopwatch::now_timeval() const
2. rusage ru;
3. getrusage(RUSAGE_SELF, &ru);
4. return ru.ru_utime;
5.
如何将这一行 (3) 解析为工作 Windows 行?我已经实现了 rusage
和 timeval
类,所以它们不会成为问题。
【问题讨论】:
它们是不同的操作系统,我不认为 Windows 可以直接翻译 linuxrusage
结构中的所有字段。
我猜它没有,这就是我问的原因。我正在寻找有关如何使其以 linux 中的方式工作的任何线索。我能找到的最好的是linux implementation。
如果操作系统没有类似的东西,我认为你不能让它像在 linux 中那样工作。同样:Windows 有很多操作系统信息可供您查询,这些信息在 linux 中是不可用的。
【参考方案1】:
在 PostgreSQL 源代码中你可以找到:
/*
* This code works on:
* solaris_i386
* solaris_sparc
* hpux 9.*
* win32
* which currently is all the supported platforms that don't have a
* native version of getrusage(). So, if configure decides to compile
* this file at all, we just use this version unconditionally.
*/
int
getrusage(int who, struct rusage *rusage)
#ifdef WIN32
FILETIME starttime;
FILETIME exittime;
FILETIME kerneltime;
FILETIME usertime;
ULARGE_INTEGER li;
if (who != RUSAGE_SELF)
/* Only RUSAGE_SELF is supported in this implementation for now */
errno = EINVAL;
return -1;
if (rusage == (struct rusage *) NULL)
errno = EFAULT;
return -1;
memset(rusage, 0, sizeof(struct rusage));
if (GetProcessTimes(GetCurrentProcess(),
&starttime, &exittime, &kerneltime, &usertime) == 0)
_dosmaperr(GetLastError());
return -1;
/* Convert FILETIMEs (0.1 us) to struct timeval */
memcpy(&li, &kerneltime, sizeof(FILETIME));
li.QuadPart /= 10L; /* Convert to microseconds */
rusage->ru_stime.tv_sec = li.QuadPart / 1000000L;
rusage->ru_stime.tv_usec = li.QuadPart % 1000000L;
memcpy(&li, &usertime, sizeof(FILETIME));
li.QuadPart /= 10L; /* Convert to microseconds */
rusage->ru_utime.tv_sec = li.QuadPart / 1000000L;
rusage->ru_utime.tv_usec = li.QuadPart % 1000000L;
#else /* all but WIN32 */
来自https://github.com/postgres/postgres/blob/7559d8ebfa11d98728e816f6b655582ce41150f3/src/port/getrusage.c
【讨论】:
以上是关于将 getrusage 从 linux 转换为 windows的主要内容,如果未能解决你的问题,请参考以下文章
程序运行时间测试 - 使用系统函数 getrusage 获取程序运行时间
在 Linux 中是不是有任何将 wstring 或 wchar_t* 转换为 UTF-8 的内置函数?