我正在寻找某种类型的库,它可以在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频率,即使其他工具显示动态频率变化.
我搜索了这样的库,但大多数结果都带有小工具等,这些都没用.
我用过了代码
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) 我试图获得总CPU使用率的百分比 label1.Caption
我搜索过并找到了这些:
不起作用 - http://www.vbforums.com/showthread.php?345723-DELPHI-Get-CPU-Usage
不是我需要的 - http://delphi.cjcsoft.net/viewthread.php?tid=42837
这就是我正在做的事情:
我相信有一种简单的方法就像我们使用RAM一样.
GlobalMemoryStatus(RamStats);
Label1.Caption := Format('RAM: %d %%', [RamStats.dwMemoryLoad]);
Run Code Online (Sandbox Code Playgroud) 我试图找出在 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)
/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) 我应该编写一个不会崩溃并且可以近似于空闲存储(堆内存)大小的程序。提示是
提示:使用循环一次分配 1000000 个字节,并将 1 添加到 unsigned long long 计数器;然后当分配失败时,打印计数器乘以 1000000.0。
这是我第一次接触编程和 C++,所以我完全迷失了开始。free store的大小不是取决于电脑的ram吗?我怎么可能以字节为单位计算大内存的大小?
另外什么是无符号长长?
我在具有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++我可以获得有关计算机的基本信息吗?例如,有没有办法可以检查正在使用多少内存(整个计算机不仅仅是我的计算机),可用的总内存,虚拟内存使用情况,CPU使用率,网络统计数据等等?
我使用的是Mac OS X Snow Leopard但我更喜欢可以为所有Mac OS(即Lion)实施的解决方案
如果我有这个代码:
#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类型的特定对象在堆栈上使用但不计算静态或动态内存的内存大小
我需要确定unix进程的CPU使用率......所以,我想写一个bash脚本,它将启用计时器,运行一些进程,停止计时器.我必须知道该过程如何使用CPU.然后与另一个进程进行比较 - 其中哪些进程使用较少的CPU.试过这个帖子,但是使用c ++,我想在bash中做到这一点.谢谢.
我目前正在使用此答案中的代码,并在评论中建议稍作修改.但是,无论我在内存中分配了多少个对象,列出的内存使用量总是比任务管理器列出的大约多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:
任务管理器:
资源监控:
分配10,000个虚拟对象时的结果:
debugText:
任务管理器:
资源监控:
编辑:
使用资源监视器(perfmon)作为建议的注释后,我发现Working Set匹配我正在使用的内存列表函数的列.但是,我仍然感到困惑的是为什么Working Set列和Private列之间有大约14MB的差异(后者是任务管理器似乎使用的).为什么会这样?