コード例 #1
0
        private static void GatherCommonPerCoreInformation()
        {
            if (RuntimeInformation.ProcessArchitecture != Architecture.X86 &&
                RuntimeInformation.ProcessArchitecture != Architecture.X64)
            {
                return;
            }

            for (var i = 0; i < information.Cpu.LogicalCores; i++)
            {
                var core   = information.Cpu.Cores.First(c => c.Number == i);
                var thread = Util.RunAffinity(1uL << i, () =>
                        {
                        if (information.Cpu.MaxCpuIdFeatureLevel >= 16)
                        {
                            Opcode.Cpuid(out var result, 0x16, 0);

                            core.ReferenceNormalClockSpeed = result.eax;
                            core.ReferenceMaxClockSpeed    = result.ebx;
                            core.ReferenceBusSpeed         = result.ecx;
                        }
                    });
コード例 #2
0
        // TODO: Tests

        private static void GetCoreSpeeds()
        {
            Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;

            for (var i = 0; i < information.Cpu.LogicalCores; i++)
            {
                if (i > 64)
                {
                    // Too long for long
                    break;
                }

                var core = information.Cpu.Cores.First(c => c.Number == i);

                core.NormalClockSpeed = information.Cpu.NormalClockSpeed;

                using var ct = new CancellationTokenSource();
                PerformanceCounter counter = null;

                if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                {
                    counter =
                        new PerformanceCounter("Processor Information", "% Processor Performance", "0," + i);

                    counter.NextValue();
                }

                var thread = Util.RunAffinity(1uL << i, () =>
                        {
                        var g = 0;

                        while (!ct.IsCancellationRequested)
                        {
                            g++;
                        }
                    });

                Thread.Sleep(1000);

                var value = core.NormalClockSpeed;

                if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                {
                    value = (uint)(counter.NextValue() / 100.0f * value);
                    counter.Dispose();
                }
                else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
                {
                    try
                    {
                        // KHz
                        var freq = ulong.Parse(
                            File.ReadAllText($"/sys/devices/system/cpu/cpu{i}/cpufreq/scaling_cur_freq"));

                        value = (uint)(freq / 1000);
                    }
                    catch (Exception)
                    {
                        // Abort early since failing once means we'll most likely fail always.
                        ct.Cancel();
                        break;
                    }
                }

                core.MaxClockSpeed = value;
                ct.Cancel();
                thread.Wait();
            }

            Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.Normal;
            information.Cpu.MaxClockSpeed =
                information.Cpu.Cores.Count > 0 ? information.Cpu.Cores.Max(c => c.MaxClockSpeed) : 0;
        }