最近,我在构建程序时变得更加注重健康,我观察到大多数程序需要 2 或 3 分钟才能执行,当我检查任务调度程序时,我发现它们消耗了 100% 的 CPU 使用率,可以我在代码中以编程方式限制这种用法?这肯定会让我能够在给定时间运行多个程序。
谢谢,
尼迪
这个帖子已经有四年多了,它仍然让我烦恼,接受的答案是批评这个问题而不是回答它。您想要限制程序占用的 CPU 时间的正当理由有很多,我可以立即列出一些。
不使用所有可用的空闲 CPU 周期似乎是一种浪费,但这种心态是有缺陷的。与旧式 CPU 不同,大多数现代 CPU 并不以固定时钟速度运行 - 许多 CPU 都有省电模式,可以在这些模式下运行当负载较低时降低时钟速度和 CPU 电压。 CPU 在执行计算时也会比运行 NOOP 时消耗更多的电量。这对于在高负载时需要风扇来冷却 CPU 的笔记本电脑尤其重要。短时间以 100% 的速度运行任务所消耗的能源远多于以 25% 的速度运行任务四倍的时间。
想象一下,您正在编写一个后台任务,旨在在后台定期索引文件。索引任务是否应该以较低的优先级尽可能多地使用 CPU,还是将自身限制在 25% 并根据需要持续时间?好吧,如果它要消耗笔记本电脑上 100% 的 CPU,CPU 就会变热,风扇就会启动,电池也会很快耗尽,用户会感到恼火。如果索引服务自我节流,笔记本电脑可能能够以非常低的 CPU 时钟速度和电压运行完全被动冷却。
顺便说一句,Windows 索引服务现在在较新版本的 Windows 中自我限制,而在旧版本中从未这样做过。有关仍然不会限制自身并经常惹恼人们的服务的示例,请参阅 Windows Installer 模块。
如何在 C# 中内部限制应用程序的一部分的示例:
public void ThrottledLoop(Action action, int cpuPercentageLimit) {
Stopwatch stopwatch = new Stopwatch();
while(true) {
stopwatch.Reset();
stopwatch.Start();
long actionStart = stopwatch.ElapsedTicks;
action.Invoke();
long actionEnd = stopwatch.ElapsedTicks;
long actionDuration = actionEnd - actionStart;
long relativeWaitTime = (int)(
(1/(double)cpuPercentageLimit) * actionDuration);
Thread.Sleep((int)((relativeWaitTime / (double)Stopwatch.Frequency) * 1000));
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)