我知道设置线程优先级是堆栈溢出的禁忌话题,但我确信我的应用程序是提高优先级的好选择。为了证明这一点,我解释了下面的情况。现在的问题是如何有效地做到这一点?
应用程序是.NET 4 (C#)控制台应用程序,它执行一个复杂的算法,执行时间约为5个小时。算法完全不是内存密集型的,只是处理器密集型的.它进行数字处理,不执行任何磁盘I/O、数据库连接、网络连接等操作。应用程序的输出只是一个数字,它在最后写入控制台。换句话说,该算法是完全独立的,没有依赖关系。
该应用程序运行在自己专用的16核心64位计算机上,运行Windows,其空闲RAM远远超过它所需的(8GB)。我的意思是,服务器已经被专门用于运行这个应用程序。
我已经尽可能多地优化了代码,使用了广泛的概要分析、花哨的数学快捷方式和一些绕行的技巧。
以下是伪码的总体结构:
public static void Main ()
{
Process.GetCurrentProcess().PriorityBoostEnabled = true;
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;
// Of course this only affects the main thread rather than child threads.
Thread.CurrentThread.Priority = ThreadPriority.Highest;
BigInteger seed = SomeExtremelyLargeNumber; // Millions of digits.
// The following loop takes [seed] and processes some numbers.
result1 = Parallel.For(/* With thread-static variables. */);
while (true) // Main loop that cannot be parallelized.
{
// Processes result1.
result2 = Parallel.For(/* With thread-static variables. */);
// Processes result2.
result1 = Parallel.For(/* With thread-static variables. */);
if (result1 == criteria)
break;
// Note: This loop does not need to sleep or care about system responsiveness.
}
}现在,基于SO上与线程优先级相关的问题,我认为使用ThreadPool的任何东西都不应该在优先级方面受到干扰。所以,如果我需要切换到手动线程,就这样吧。
问题:
发布于 2012-08-21 09:20:02
有了这样一个应用程序,我希望更改优先级将使整个运行时产生0%的差异。如果你已经用尽了CPU的使用,所有16个核心100%在做真正的工作,没有更多的你可以做。
发布于 2012-08-21 10:37:06
您不需要为单个线程设置优先级,只需为整个进程设置优先级,因为它的大多数线程显然都在执行重要的工作。
不过,我不认为它会对像你这样的CPU密集型应用产生任何影响。唯一可以强行抢占您自己的进程的进程是I/O密集型应用程序,传统上大多数OSes都喜欢这些应用程序,但是由于您有一台专用的机器,所以这不会成为一个问题(而且,在我的经验中,Windows非常轻量级,所以如果您的应用程序是唯一运行的,它就不会受到干扰)。
作为一个旁注:
算法完全不是内存密集型的,只是处理器密集型的.它进行数字处理,不执行任何磁盘I/O、数据库连接、网络连接等操作。
它不执行“明显”的I/O操作这一事实并不意味着它不能占用内存。如果您正在处理大型数组或其他数据结构,CPU将不断向主内存发出读/写操作,并且正在做大量的工作来在不同的内存级别之间移动数据。即使只使用数字也会对程序的性能产生负面影响,如果操作不当的话。
发布于 2019-02-18 18:43:21
我的代码可以更改进程和线程的优先级。
public void SetPriorityProcessAndTheards(string nameProcess,ProcessPriorityClass processPriority, ThreadPriorityLevel threadPriorityLevel)
{
foreach(Process a in Process.GetProcessesByName(nameProcess))
{
a.PriorityBoostEnabled = true;
a.PriorityClass = processPriority;
foreach(ProcessThread processThread in a.Threads)
{
processThread.PriorityLevel = threadPriorityLevel;
processThread.PriorityBoostEnabled = true;
}
}
}https://stackoverflow.com/questions/12050925
复制相似问题