用 C++ 模拟 CPU 负载

2023-12-26

我目前正在使用 C++ 在 Windows 中编写一个应用程序,我想模拟 CPU 负载。

我有以下代码:

void task1(void *param) { 

unsigned elapsed =0;
unsigned t0;

while(1){

    if ((t0=clock())>=50+elapsed){//if time elapsed is 50ms

        elapsed=t0;
        Sleep(50);
    }
  }
}

int main(){

int ThreadNr;

for(int i=0; i < 4;i++){//for each core (i.e. 4 cores)
    _beginthread( task1, 0, &ThreadNr );//create a new thread and run the "task1" function
}

while(1){}
}

我使用与此线程中给出的答案相同的方法编写了此代码:模拟稳定的 CPU 负载和峰值 https://stackoverflow.com/questions/2514544/simulate-steady-cpu-load-and-spikes

我的问题是:

  1. 我是否已将另一篇文章中的 C# 代码正确翻译为 C++?
  2. 此代码会在四核处理器上产生 50% 的平均 CPU 负载吗?
  3. 如何在合理的精度内找出 CPU 的负载百分比? (任务管理器是我唯一的选择吗?)

EDIT:我问这个问题的原因是我希望最终能够在合理的容差范围内生成 10,20,30,...,90% 的 CPU 负载。此代码似乎可以很好地生成 70%

有人知道我如何生成所述负载但仍然能够在不同的计算机(即具有不同的 CPU)上使用我的程序吗?


乍一看,这看起来像不漂亮但正确的 C++ 或 C(一个简单的方法是编译它)。包含缺失(<windows.h>, <process.h>, and <time.h>)但除此之外它编译得很好。

注意clock and Sleep不是非常准确,并且Sleep也不是很可靠。平均而言,线程函数应该按预期工作(给予或采取百分之几的变化)。

但是,关于问题 2) 你应该替换最后一个while(1){}用一些阻挡而不是旋转的东西(例如WaitForSingleObject or Sleep如果你愿意的话)。否则整个程序将not四核上有 50% 的负载。由于主线程,您将在一个核心上获得 100% 的负载,再加上四个工作人员的 4x 50% 负载。显然,每个核心的总消耗量将超过 50%(并且会导致线程从一个核心跳到另一个核心,从而产生令人讨厌的副作用)。

使用任务管理器或类似的实用程序来验证是否获得了所需的负载是一个不错的选择(并且因为它是easiest解决方案,这也是最好的解决方案)。

另请注意,以这种方式模拟负载将probably种工作,但不是 100% 可靠。
可能存在难以预测的影响(内存、执行单元)。例如,假设您在此循环中使用了 100% 的 CPU 整数执行单元(合理的假设),但浮点或 SSE 单元为零。现代 CPU 可能会在实际核心或逻辑核心之间共享资源,您可能无法准确预测会得到什么效果。或者,另一个线程可能受内存限制或存在严重页面错误,因此减少 CPU 时间不会像您想象的那样影响它(实际上可能会给它足够的时间来使预取更好地工作)。或者,它可能会阻止 AGP 传输。或者,还有其他你不能说的事情。

EDIT:

改进的版本,更短的代码,修复了一些问题并且也按预期工作:

  • Uses clock_t对于返回的值clock(这在技术上比使用非专门的“更正确”typedef'd 整数。顺便说一句,这可能就是原始代码无法按预期工作的原因,因为clock_t is a signedWin32 下的整数。条件在if()总是评价true,所以worker几乎一直在睡觉,不消耗CPU。
  • 旋转时代码更少,数学更简单。计算未来 50 个时钟周期的唤醒时间并旋转直至达到该时间。
  • Uses getchar to block the program at the end. This does not burn CPU time, and it allows you to end the program by pressing Enter. Threads are not properly ended as one would normally do, but in this simple case it's probably OK to just let the OS terminate them as the process exits.
  • 与原始代码一样,这假设clock and Sleep使用相同的刻度线。这无疑是一个大胆的假设,但在您在原始代码中使用的 Win32 下它是正确的(两个“刻度”都是毫秒)。 C++没有类似的东西Sleep(没有boost::thread,或 C++11std::thread),因此,如果打算实现非 Windows 可移植性,无论如何您都必须重新考虑。
  • 与原始代码一样,它依赖于函数(clock and Sleep),这是不精确且不可靠的。Sleep(50) equals Sleep(63)在我的系统上不使用timeBeginPeriod。尽管如此,该程序运行得“几乎完美”,导致我的机器负载增加了 50% +/- 0.5%。
  • 与原始代码一样,这没有考虑线程优先级。具有高于正常优先级的进程将完全不受此限制代码的影响,因为这就是 Windows 调度程序的工作原理 http://msdn.microsoft.com/en-us/library/windows/desktop/ms685100%28v=vs.85%29.aspx.

    #include <windows.h>
    #include <process.h>
    #include <time.h>
    #include <stdio.h>
    
    
    void task1(void *)
    {
        while(1)
        {
            clock_t wakeup = clock() + 50;
            while(clock() < wakeup) {}
            Sleep(50);
        }
    }
    
    int main(int, char**)
    {
        int ThreadNr;
        for(int i=0; i < 4; i++) _beginthread( task1, 0, &ThreadNr );
    
        (void) getchar();
        return 0;
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 C++ 模拟 CPU 负载 的相关文章

  • Tensorflow 中的自定义资源

    由于某些原因 我需要为 Tensorflow 实现自定义资源 我试图从查找表实现中获得灵感 如果我理解得好的话 我需要实现3个TF操作 创建我的资源 资源的初始化 例如 在查找表的情况下填充哈希表 执行查找 查找 查询步骤 为了促进实施 我
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 如果.Net Core可以在Windows上运行,为什么不能在.Net Framework中引用.Net Core DLL?

    我明白为什么 Net Framework 可能会在 Net Core IE 中导致问题 因为不存在特定于 Windows 平台的 API 但是为什么不能直接引用 Net Core 作为 Net Framework 中的库呢 如果 Net C
  • 当我单击 C# 中的“取消”按钮时重定向到新页面(Web 部分)

    Cancel button tc new TableCell btnCancel new Button btnCancel Text Cancel btnCancel Click new EventHandler btnCanel Clic
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 无法使用 Ninject 将依赖项注入到从 Angular 服务调用的 ASP.NET Web API 控制器中

    我将 Ninject 与 ASP NET MVC 4 一起使用 我正在使用存储库 并希望进行构造函数注入以将存储库传递给其中一个控制器 这是实现 StatTracker 接口的上下文对象 EntityFramework public cla
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • 如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, ... }”行为?

    注意 这个问题是关于不必指定元素数量并且仍然允许直接初始化嵌套类型 这个问题 https stackoverflow com questions 6111565 now that we have stdarray what uses are

随机推荐

  • 整数区间内的哈希表键

    我不知道这是否可能 但我正在尝试创建一个哈希表 其中 Interval 是一个具有 2 个整数 长值 一个开始和一个结束的类 我想做这样的事情 Hashtable
  • 如何在 Jitpack 上使用 maven 发布 Kotlin 库的 KDoc?

    背景 经过大量的研究和尝试 并寻求帮助 我成功地在 Jitpack 上使用 maven 发布了一个私有的 Github 存储库 写为here https stackoverflow com a 67071394 878126 因此 目前我放
  • Spring 类加载应用程序上下文

    我有一个 Spring Web 项目 我需要在初始化应用程序上下文后加载一些类 因为这些类最终将在将来使用 因此 我尝试在使用前预加载它们以提高性能 怎么做 请帮忙 Thanks 要将一个类加载到 JVM 中 只需调用Class forNa
  • 修改对象的键而不创建新对象[重复]

    这个问题在这里已经有答案了 我有以下输入 foo 4 bar 3 我想修改这个对象的键以获得 x foo y 4 x bar y 3 是否可以修改对象而不创建新对象 可用 jQuery 是的 您只需添加新密钥并删除旧密钥即可 obj x f
  • 为什么我们不能像其他模式对象一样删除引用的类型

    When a Type尝试删除或替换有依赖项的情况下 oracle 会抛出以下错误 与其他模式对象 如过程 不同 在其他模式对象中 您删除一个对象 然后它就会被删除 并且依赖对象也会被删除invalid 我的两个问题是 1 为什么是Type
  • 在 Sqlite 中存储 NSMutableArray

    我有一个 NSMutableArray 其中包含多个 CGRect 的坐标和大小 我想将其存储到 sqlite 中 是否可以存储整个数组 或者我应该将 CGRect 手动存储在数据库中 UPDATE 这是我从数据库检索到的数据 62706c
  • 为什么原始数据类型可以在不包含 System 命名空间的情况下工作?

    我读到所有原语都属于System命名空间 如果我评论掉using System我预计我的程序中会出现构建错误 但它运行成功 为什么是这样 这是因为int是一个别名System Int32 并且由于 Int32 已经以其名称空间为前缀 即 完
  • 如何捕获 C 函数调用的 Haskell 回调函数中引发的 Haskell 异常?

    有没有什么好方法来捕获由c函数调用的haskell回调函数中引发的haskell异常 例如 让我有一个简单的 c 函数 它只调用给定的回调 void callmeback void callback callback 以及通过 ffi 使用
  • 在Linux和Windows机器上使用C++调度任务

    我正在开发网关模拟器应用程序 网关将视频流式传输到客户端 网关模拟器可以模拟 1000 个网关 用户可以发出命令 例如 1 小时后开始录制并录制长达 1 小时 或者可以流式传输视频5点钟 所以基本上安排了任务 该网关将在 Windows 和
  • 带 Y 组合器的列表函数没有递归,为什么?

    注意 这是一种家庭作业 而不是一种家庭作业 最终目标是拥有一个函数 该函数生成一组数字的幂集 以数字列表的形式提供给该函数 我有该函数的递归版本 但我现在需要找到一些方法来替换我拥有的解决方案中的每个显式递归函数 append mapm等
  • 64 位计算机上的 32 位程序不会因 NullReferenceException 而崩溃

    我有一段代码抛出一个NullReferenceException dataSource DataSource GetView 它抛出是因为dataSource is null GetView返回一个DataTable 但是 当在一台计算机
  • Ruby 中的一行 if 语句

    我有以下代码 if day gt 31 day 31 month April end 我可以把它写在一行中 而不是 if day gt 31 then day 31 and month April end 我试过这样 if day gt 3
  • 使用VideoJS播放器播放RTMP流

    我正在尝试玩RTMP流式传输VideoJS玩家 下面是我的代码
  • Wildfly 9 http 转 https

    我想将请求从 HTTP 重定向到 HTTPS 我正在使用 Wildfly 9 经过谷歌搜索后 我发现了以下内容 但它不起作用 我希望有人
  • 如何在 Java 中将 BigInteger 值转换为十六进制

    我正在制作一个Java程序 我有一个 BigInteger 数字 我需要将其转换为十六进制 我尝试了以下代码 String dec null System out println Enter the value in Dec Buffere
  • 更改特定数据的颜色

    我想更改 json 文件中某些数据的颜色 如果我有一个包含日期的数据集 并且我想要 2017 年的日期为浅粉色 我怎样才能在不影响2018年 2019年等的情况下实现这一目标 日期 json文件 id 1 month 2017 03 01
  • 大型 XML 文件和分页,可能吗?

    问题 当在您的计算机上本地打开非常大的 XML 文件时 几乎可以肯定的是 该文件需要一段时间才能打开 这通常意味着您的计算机因认为没有响应而被锁定 如果您为用户提供他们使用的相当复杂的数据库或系统的 XML 备份 这就是一个问题 他们能够打
  • WPF - 如何保存没有任何 Alpha 通道的 PNG?

    我有一个BitmapSource 我将它保存为像这样的png PngBitmapEncoder enc new PngBitmapEncoder enc Frames Add myBitmapSource enc Save fs 如何在没有
  • C 中自动 stdout 缓冲区刷新的规则是什么?

    我只是好奇应该满足哪些条件才能自动刷新标准输出缓冲区 首先 我很困惑这个伪代码不会在每次迭代时打印输出 while 1 printf Any text sleep 1 但如果我添加换行符 它就会 经过几次实验 我发现在我的机器上标准输出缓冲
  • 用 C++ 模拟 CPU 负载

    我目前正在使用 C 在 Windows 中编写一个应用程序 我想模拟 CPU 负载 我有以下代码 void task1 void param unsigned elapsed 0 unsigned t0 while 1 if t0 cloc