// 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; }