- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在使用 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){}
}
我使用与此线程中给出的答案相同的方法编写此代码:Simulate steady CPU load and spikes
我的问题是:
编辑: 我问这个问题的原因是我希望最终能够在合理的容差范围内生成 10,20,30,...,90% 的 CPU 负载。此代码似乎可以很好地生成 70%< 的负载,但在低于 70% 的任何负载下似乎都非常不准确(由任务管理器 CPU 负载读数测量)。
关于我如何生成所述负载但仍然能够在不同计算机(即具有不同 CPU)上使用我的程序有任何想法吗?
最佳答案
乍一看,这看起来像不完美但正确的 C++ 或 C(确定的一种简单方法是编译它)。缺少包含( <windows.h>
、 <process.h>
和 <time.h>
),但编译正常。
请注意 clock
和 Sleep
不是非常准确,并且Sleep
也不是很可靠。不过,平均而言,线程函数应该按预期工作(给出或接受几个百分比的变化)。
但是,关于问题 2),您应该替换最后一个 while(1){}
用阻塞而不是旋转的东西(例如 WaitForSingleObject
或 Sleep
如果你愿意的话)。否则整个程序将不会在四核上有 50% 的负载。由于主线程,您将在一个核心上拥有 100% 的负载,加上来自您的四个工作线程的 4x 50%。这显然会导致每个核心超过 50%(并且会导致线程从一个核心反弹到另一个核心,从而导致严重的副作用)。
使用任务管理器或类似的实用程序来验证您是否获得了所需的负载是一个不错的选择(因为它是最简单的解决方案,所以它也是最好的解决方案)。
另请注意,以这种方式模拟负载可能会起作用,但并非 100% 可靠。
可能存在难以预测的影响(内存、执行单元)。例如,假设您在此循环中使用了 100% 的 CPU 整数执行单元(合理的假设),但它的 float 或 SSE 单元为零。现代 CPU 可能会在实核或逻辑核之间共享资源,您可能无法准确预测得到的效果。或者,另一个线程可能受内存限制或有严重的页面错误,因此占用 CPU 时间不会像您想象的那样影响它(实际上可能会给它足够的时间来使预取更好地工作)。或者,它可能会阻止 AGP 传输。或者,您无法分辨的其他内容。
编辑:
改进后的版本,更短的代码修复了一些问题并且也能按预期工作:
clock_t
clock
返回的值(从技术上讲,这比使用不是特别使用 typedef
的整数“更正确”。顺便说一句,这可能就是原始代码无法按预期工作的原因,因为 clock_t
是一个已签名 Win32 下的整数。if()
中的条件总是计算true
,所以工作人员几乎一直在 sleep ,不消耗 CPU。getchar
最后阻止程序。这不会消耗 CPU 时间,并且允许您通过按 Enter 结束程序。线程没有像通常那样正确结束,但在这种简单的情况下,让操作系统在进程退出时终止它们可能没问题。clock
和 Sleep
使用相同的滴答声。诚然,这是一个大胆的假设,但它在您在原始代码中使用的 Win32 下是正确的(两个“刻度”都是毫秒)。 C++ 没有类似 Sleep
的东西(没有 boost::thread
或 C++11 std::thread
),因此如果想要非 Windows 可移植性,您无论如何都必须重新考虑。clock
和 Sleep
)。 Sleep(50)
等于 Sleep(63)
在我的系统上不使用 timeBeginPeriod
.尽管如此,该程序“几乎完美”地工作,导致我的机器上有 50% +/- 0.5% 的负载。与原始代码一样,这没有考虑线程优先级。具有高于正常优先级的进程将完全不受此限制代码的影响,because that is how the Windows scheduler works .
#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;
}
关于c++ - 在 C++ 中模拟 CPU 负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14231322/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!