c# - 增加单核 CPU 使用率
问题描述
我在 C# 中有一个简单的 while 循环,如下所示:
private static long a;
static void Main(string[] args)
{
a = 0;
while (a >= 0)
a++;
Console.WriteLine(a);
}
无论我做什么,它都不会使用超过 60% 的单个 cpu 线程(逻辑处理器),通常在 40% 左右。我希望它像 C++ 循环一样使用 100%。
- 我在发布模式下运行
- 我包括了写行,以便它被迫保持循环而不是优化它
- 静态的,所以它不能自动创建委托线程(不确定这是否可能,但只是为了确定)
- 如果重要,请使用 .NET core 2.1
- Visual Studio 2017 IDE/编译器
- 常规控制台应用程序
在人们问我之前,我知道它永远不会使用 100% 的整体 cpu,因为它是单线程的。我想要一个 100% 的逻辑处理器。
任何帮助,将不胜感激。
编辑:与单线程应用程序是否仅在一个运行 exe 的 CPU 上运行不一样无助于它不是 linq 表达式。
解决方案
使用这个我得到每个 CPU 100% 或每个核心使用率 100%
我不得不将计数器更改为 long,因为我的电脑对于 int 来说太快了 :-)
我还必须为单胎面测试设置一个核心的亲和力,否则它会不断改变核心。
我的猜测是您的工具报告了错误的值。如果 CPU 具有 turbo 模式,则可以在某些 SW 中显示无意义的值。在这种情况下,Windows 经常显示超过 100% 的 cpu 频率。
另一个原因可能是过热或某些电池保护程序。
尝试在最大性能设置和不同的 PC 上
using System;
using System.Threading;
namespace ConsoleApp1
{
class Program
{
static void BusyDelay()
{
long i = 10000000000;
while (i-- > 0) ;
}
static void Main(string[] args)
{
/* use "1" intead of "ProcessorCount" for single thread insted */
for (int i = 0; i < Environment.ProcessorCount ; i++)
{
new Thread(BusyDelay).Start();
}
}
}
}
推荐阅读
- c - 删除函数二叉搜索树 BST,其父传递树指针作为参数
- azure - botbuilder的自定义命令
- visual-studio - 打开新文件时默认net48是构建目标,如何将netcoreapp3.1设为默认?
- css - 关闭侧边栏与反应结合反应状态
- .net - 如何在 WCF 应用程序中隐藏初始化方法?
- arrays - 为什么在 React 中使用扩展运算符只会第二次附加到空数组?
- php - 如何将高级自定义字段与木材一起使用来检索数组值?
- css - 选择不是分类元素后代的元素
- angular - 使用 ngValue 和 ControlValueAccessor 选择不返回对象,只返回 Angular 中的选定值
- javascript - 如何解决 skel-layers-min.js 中未定义 skel django 框架错误