相关疑难解决方法(0)

测量CPU频率(x86/x64)

我正在寻找某种类型的库,它可以在32位和64位Windows上定期为Intel和AMD处理器提供准确的CPU频率值.

这样做的目的是准确地测量给定计算机上的CPU负载.问题是调用QueryPerformanceCounter()返回时钟滴答(用于测量活动的持续时间),但由于SpeedStep或TurboBoost,底层CPU频率不是恒定的.我发现有几台计算机在BIOS中关闭SpeedStep/TurboBoost并且不会根据负载阻止CPU频率缩放.

我想看看是否有可能被用来检测CPU频率的变化(很像如何提供任何库Throttlestop/ CPU-Z甚至概述选项卡Resource Monitor在Windows 7中),这样我就可以查询并与我的其他测量一起保存此信息.性能计数器似乎没有返回可靠的信息,因为我的计算机总是返回100%的CPU频率,即使其他工具显示动态频率变化.

我搜索了这样的库,但大多数结果都带有小工具等,这些都没用.

c windows 64-bit x86 cpu-speed

6
推荐指数
1
解决办法
2886
查看次数

虚拟内存的实际应用

我用过了代码

MEMORYSTATUSEX memInfo;
memInfo.dwLength = sizeof(MEMORYSTATUSEX);
GlobalMemoryStatusEx(&memInfo);
DWORDLONG totalVirtualMem = memInfo.ullTotalPageFile;
DWORDLONG virtualMemUsed = memInfo.ullTotalPageFile - memInfo.ullAvailPageFile;
DWORDLONG totalPhysMem = memInfo.ullTotalPhys;
Run Code Online (Sandbox Code Playgroud)

这里提供

输出如下:2.3GB.

totalVirtualMem = 8.5 Gb
virtualMemUsed  = 2.3 Gb
totalPhysMem    = 4   Gb
Run Code Online (Sandbox Code Playgroud)

这是否意味着我的程序需要2.3Gb的内存?你还可以评论总虚拟内存和RAM吗?我也无法运行此代码:

PROCESS_MEMORY_COUNTERS_EX pmc;
GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
SIZE_T virtualMemUsedByMe = pmc.PrivateUsage;
Run Code Online (Sandbox Code Playgroud)

因为它给出了错误,

error C2664: 'GetProcessMemoryInfo' : cannot convert parameter 2 from 'PROCESS_MEMORY_COUNTERS_EX *' to 'PPROCESS_MEMORY_COUNTERS'
Run Code Online (Sandbox Code Playgroud)

memory virtual

5
推荐指数
1
解决办法
1847
查看次数

获取总CPU使用率的百分比

我试图获得总CPU使用率的百分比 label1.Caption

我搜索过并找到了这些:

在此输入图像描述

我相信有一种简单的方法就像我们使用RAM一样.

 GlobalMemoryStatus(RamStats);
 Label1.Caption := Format('RAM: %d %%', [RamStats.dwMemoryLoad]);
Run Code Online (Sandbox Code Playgroud)

delphi cpu performancecounter delphi-xe

5
推荐指数
3
解决办法
7435
查看次数

以编程方式检索进程的峰值虚拟内存

我试图找出在 Linux、macOS 和 FreeBSD 上运行的进程的峰值虚拟内存。

我关注的是峰值虚拟内存,因为这是在任何给定点对我的进程的峰值内存使用量的相关衡量,超出了物理 RAM 的限制(峰值 RSS 将提供的)。

本着如何确定进程内部的 CPU 和内存消耗?我计划使用这篇文章来编译这三个平台的解决方案(如果您有工作代码可以提供,我很乐意将其扩展到更多平台)。

视窗

在 Windows 上,以下内容似乎返回与Process Explorer相同的值:

PROCESS_MEMORY_COUNTERS_EX pmc;
GetProcessMemoryInfo(
    GetCurrentProcess(),
    reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&pmc),
    sizeof(pmc));
return pmc.PeakPagefileUsage;
Run Code Online (Sandbox Code Playgroud)

Linux

/proc/self/status解析Linux 上最佳/唯一选项的输出吗?所有 Linux 版本是否都返回以完全相同的方式格式化的相同信息?

作为参考,下面是 Ubuntu 上的示例输出:

root@appleseedhq:~# cat /proc/self/status
Name:   cat
State:  R (running)
Tgid:   12975
Ngid:   0
Pid:    12975
PPid:   12938
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups: 0
VmPeak:     7220 kB
VmSize:     7220 kB
VmLck:         0 …
Run Code Online (Sandbox Code Playgroud)

c++ linux memory macos freebsd

5
推荐指数
0
解决办法
899
查看次数

近似空闲存储(堆)大小的 C++ 程序

我应该编写一个不会崩溃并且可以近似于空闲存储(堆内存)大小的程序。提示是

提示:使用循环一次分配 1000000 个字节,并将 1 添加到 unsigned long long 计数器;然后当分配失败时,打印计数器乘以 1000000.0。

这是我第一次接触编程和 C++,所以我完全迷失了开始。free store的大小不是取决于电脑的ram吗?我怎么可能以字节为单位计算大内存的大小?

另外什么是无符号长长?

c++ memory heap-memory

4
推荐指数
1
解决办法
2108
查看次数

GlobalMemoryStatusEx不考虑新数组

我在具有16 GB RAM的Windows 10上使用c ++ builder 10.2 Tokyo.如果我跑

uint64_t FreeMBs()
{
    MEMORYSTATUSEX status;
    status.dwLength = sizeof(status);
    GlobalMemoryStatusEx(&status);
    return status.ullAvailPhys / (1024 * 1024);
}

Mem0=FreeMBs();
std::vector<int64_t> v;
v.resize(1000000000); // 1 billion
Mem1=FreeMBs();
Run Code Online (Sandbox Code Playgroud)

Mem0-Mem1大约为8 GB.

如果,而不是上述,我跑

Mem0=FreeMBs();
int64_t v=new int64_t[1000000000};
Mem1=FreeMBs();
Run Code Online (Sandbox Code Playgroud)

然后Mem0-Mem1大约为零.如果我使用malloc为数组保留空间,Mem1仍然或多或少地与Mem0保持不变.我尝试设置v [1000000000-1] = 0来查看是否触发了某些内容但它没有触发.

为什么不考虑阵列?

c++ windows winapi

4
推荐指数
1
解决办法
96
查看次数

在MacOS X上检索系统信息?

无论如何,使用C++我可以获得有关计算机的基本信息吗?例如,有没有办法可以检查正在使用多少内存(整个计算机不仅仅是我的计算机),可用的总内存,虚拟内存使用情况,CPU使用率,网络统计数据等等?

我使用的是Mac OS X Snow Leopard但我更喜欢可以为所有Mac OS(即Lion)实施的解决方案

c++ memory macos cpu networking

3
推荐指数
1
解决办法
4450
查看次数

有没有办法区分对象实例使用的内存类型?

如果我有这个代码:

#include <assert.h>

class Foo {
public:
    bool is_static();
    bool is_stack();
    bool is_dynamic();
};

Foo a;

int main()
{
    Foo b;
    Foo* c = new Foo;

    assert( a.is_static()  && !a.is_stack()  && !a.is_dynamic());
    assert(!b.is_static()  &&  b.is_stack()  && !b.is_dynamic());
    assert(!c->is_static() && !c->is_stack() &&  c->is_dynamic());

    delete c;
}
Run Code Online (Sandbox Code Playgroud)

是否有可能实现is_stack,is_static,is_dynamic方法,以便做到这一点被断言实现?

使用示例:计算Foo类型的特定对象在堆栈上使用但不计算静态或动态内存的内存大小

c++

3
推荐指数
1
解决办法
80
查看次数

Unix进程'CPU使用率

我需要确定unix进程的CPU使用率......所以,我想写一个bash脚本,它将启用计时器,运行一些进程,停止计时器.我必须知道该过程如何使用CPU.然后与另一个进程进行比较 - 其中哪些进程使用较少的CPU.试过这个帖子,但是使用c ++,我想在bash中做到这一点.谢谢.

unix bash cpu

1
推荐指数
1
解决办法
611
查看次数

当前内存使用情况显示总是比任务管理器多大约14MB

我目前正在使用此答案中的代码,并在评论中建议稍作修改.但是,无论我在内存中分配了多少个对象,列出的内存使用量总是比任务管理器列出的大约多14MB.为什么会这样?

std::stringstream ss;

PROCESS_MEMORY_COUNTERS_EX pmc;
GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
SIZE_T physMemUsedByMe = pmc.WorkingSetSize;

ss << "\nMEM: " << (physMemUsedByMe / 1024 / 1024) << " MB";    

debugText.setString(ss.str());
Run Code Online (Sandbox Code Playgroud)

正常构建的结果:

debugText:

debugText

任务管理器:

任务管理器:

资源监控:

资源监控

分配10,000个虚拟对象时的结果:

debugText:

debugText

任务管理器:

任务管理器

资源监控:

资源监控

编辑:

使用资源监视器(perfmon)作为建议的注释后,我发现Working Set匹配我正在使用的内存列表函数的列.但是,我仍然感到困惑的是为什么Working Set列和Private列之间有大约14MB的差异(后者是任务管理器似乎使用的).为什么会这样?

c++ memory windows winapi taskmanager

0
推荐指数
1
解决办法
744
查看次数