将 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 行?我已经实现了 rusagetimeval 类,所以它们不会成为问题。

【问题讨论】:

它们是不同的操作系统,我不认为 Windows 可以直接翻译 linux rusage 结构中的所有字段。 我猜它没有,这就是我问的原因。我正在寻找有关如何使其以 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的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C++ 在运行时获取内存使用情况?

什么“ru_maxrss”在getrusage中意味着什么

程序运行时间测试 - 使用系统函数 getrusage 获取程序运行时间

在 Linux 中是不是有任何将 wstring 或 wchar_t* 转换为 UTF-8 的内置函数?

将 C++ 目标文件从 linux .o 转换为 Windows .obj

CPP - 将源代码从 Windows 转换为 Linux [关闭]