我有一个用C#编写的命令行EXE.它的日志解析器每晚都会研磨几GB的日志文件.
它将处理器固定在100%很长一段时间.不理想.
我怎么能"扼杀"应用程序?它可能需要多长时间,但我宁愿让它使用更少的总CPU.
是否有一些编码方法或理论使EXE变慢并减少CPU占用?我无法在它运行的环境中做任何事情(比如更改进程优先级),因此任何更改都必须在应用程序本身的代码中.
试试这个:
using System.Diagnostics; Process myProc = Process.GetCurrentProcess(); myProc.PriorityClass = ProcessPriorityClass.BelowNormal;
如果这还不够低,那就有一个 ProcessPriorityClass.Idle
MSDN链路1
MSDN链路2
您可以使用Thread.Priority
属性设置线程的优先级.
当然,如果没有其他任何尝试运行仍然会使用100%的CPU - 但我想在这种情况下你不介意这么多.
您的应用程序是否创建任何其他线程或使用线程池?如果是这样,您可能希望确保这些线程的优先级也降低.
编辑:设置流程的总体优先级通常可能是一个更好的解决方案,但我会将此作为替代方案.
您还可以将慢速睡眠引入与主处理器挂钩的主循环中.
例如,这通常通过游戏循环来完成 - Thread.CurrentThread.Sleep(1);
每帧调用一次将使大多数游戏从使用100%cpu到使用1-2%cpu,并且仍允许合理访问.
-----编辑------
睡眠有可能降低进程或线程的优先级.主要的两个是:
通过睡眠,您可以更好地控制放弃的处理器时间.如果降低优先级,并且还有其他CPU饥饿进程,则可能会放弃比预期更多的处理器时间.[这就是为什么我没有做睡眠(0),因为这不会总是放弃处理器时间,虽然它确实放弃了一些.我已经在具有更长睡眠时间的嵌入式系统中完成了这项工作,以减少处理器的使用量.
如果您的目标是降低总CPU使用率,那么在没有其他任何运行的情况下降低进程优先级将无济于事.你还会吃掉100%的CPU.如果您尝试保持功耗(节省能源成本)或尝试降低发热量,这可能会有用,具体取决于系统的体系结构.
-----来自原创-----
对于其他样式(UI)应用程序,另一个选项是重构您的例程以使其异常,将处理分解为多个部分,并通过订阅Application.OnApplicationIdle之类的函数在块中处理它.这可以让你的UI保持一定的响应,因为它将在spurts中运行.
如果这是一个数学例程,并且它正在进行大量计算,那么降低线程优先级并允许它使用最多可用的CPU可能会更好.