Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:如何找到CPU';现在的时钟速度是多少?_C#_Cpu Speed - Fatal编程技术网

C#:如何找到CPU';现在的时钟速度是多少?

C#:如何找到CPU';现在的时钟速度是多少?,c#,cpu-speed,C#,Cpu Speed,目前正在c#/wpf中创建一种“任务管理器”。我到处寻找,但没有找到解决我问题的办法 我试图检索一个人CPU的当前时钟速度(不是利用率、基数、最小/最大值)。我尝试过使用ManagementObjects,但“CurrentClockSpeed”总是给出一个固定值3400,即3.4GHz,这是CPU的最大库存速度。我已经尝试过很多次了,它给了我同样的答案,所以我认为这不仅仅是巧合 ManagementObject Mo = new ManagementObject("Win32_Proc

目前正在c#/wpf中创建一种“任务管理器”。我到处寻找,但没有找到解决我问题的办法

我试图检索一个人CPU的当前时钟速度(不是利用率、基数、最小/最大值)。我尝试过使用ManagementObjects,但“CurrentClockSpeed”总是给出一个固定值3400,即3.4GHz,这是CPU的最大库存速度。我已经尝试过很多次了,它给了我同样的答案,所以我认为这不仅仅是巧合

    ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'");
        uint sp = (uint)(Mo["CurrentClockSpeed"]);
        System.Threading.Thread.Sleep(1000);
        sp = (uint)(Mo["CurrentClockSpeed"]);
        Mo.Dispose(); //return and such later in the code

任何关于如何解决此问题的建议(我不一定要使用ManagementObjects,我有OpenHardwareMonitor,如果需要,还可以使用其他软件包)都将不胜感激。

在WMI对象上,MaxClockSpeed属性为您提供内核的最大速度,它应该是恒定的。CurrentClockSpeed属性告诉您当前时钟速度。由于cpu节流,这可能比MaxClockSpeed低


我相信您可以在BIOS级别或通过Windows电源管理控制面板小程序禁用节流,因此,在访问MSR的英特尔CPU上运行代码时,*CurrentClockSpeed**可能始终与MaxClockSpeed

相同,然后您可以从
IA32\u MPERF(0xE7)
TSC频率时钟计数器和
IA32\u APERF(0xE8)
实际性能时钟计数器

aperf_t1 = read_aperf();
mperf_t1 = read_mperf();

sleep(1);   

aperf_t2 = read_aperf();
mperf_t2 = read_mperf();

printf("CPU freq: %f [Hz]\n", ((aperf_t2-aperf_t1) / (double)(mperf_t2-mperf_t1)) * nominal_freq);

这可能是一个天真的问题,但除了超频,为什么CPU的速度会改变?“速度”是指每次可以进行多少次计算,对吗?其他任何东西都是利用率,这是你不感兴趣的。不用担心,这一切都有点混乱!我认为当谈到“速度”时,您可能会想到的是我们可以称之为最大时钟速度的东西(GHz制造商在购买处理器时提供)。这个速度只是告诉我们它应该运行的最大速度(除非超频),以及你期望它运行的速度。但我要找的是当前的时钟速度。这只是告诉我们处理器通信时的GHz值。您的时钟速度总是上下波动,这取决于CPU的负载,因为它并不总是需要以100%的速度工作。“CurrentClockSpeed”似乎是正确的属性。在我目前使用的这个处理器上,我的介于2900和2901之间。你确定你的代码应该读得更低吗?嗯,你是不是碰巧得到了你的代码?我很肯定。我在不同的版本中运行了它,并基于TaskManager。无论发生什么情况,它都只返回一个基值,即使当前速度要低得多。@Corak
为什么CPU的速度会改变?
原因很多。例如,如果检测到过热,现代处理器将自动调节自身,作为保护自身的一种手段。操作系统也可以要求处理器以较低的时钟速度运行以节省电源。但我要寻找的是当前的时钟速度。但它返回的值不真实,即我的最大时钟速度。您如何知道返回的速度不正确?你是如何确定你当前的时钟速度的?@user9622460因为你说你对编码是新手,那么这可能有点超出了你的范围。瞧,在你能跑之前先学会走路——即使在这种情况下“跑”只是拉一个GitHub回购。@Jay Oh ic。如果我错了,请纠正我,但它看起来确实需要在一系列指令上循环,并且该体系结构的延迟是已知的。注意,使用基准来推断频率,而不是读取晶体频率、基本时钟和倍频器,或者访问实际时钟计数器(需要ring0)。@Jay得到了它。它是否适用于我的用例并不明显,因为它可能需要不可忽略的开销,并且对超线程产生的噪声非常敏感。(注意,在同一个内核上运行的第二个线程会减慢试图测量频率的线程的速度。)尽管如此,还是有用的。谢谢