我知道在线社区上设置线程优先级有些禁忌,但我相信我的应用程序是一个适合提高优先级的好候选者。为了证明这一点,我已经在下面解释了背景情况。现在的问题是如何有效地做到这一点?
该应用程序是.NET 4.0(C#)控制台应用程序,执行一个大约五个小时的复杂算法。该算法不会占用太多内存,只占用处理器资源。它进行数字计算,不执行任何磁盘I/O、数据库连接、网络连接等操作。该应用程序的输出仅是一个数字,它在结束时将其写入控制台。换句话说,该算法是完全独立的,没有任何依赖关系。
该应用程序在其自己的专用16核64位机器上运行,运行Windows Server,比它所需的空闲RAM要多得多(8GB)。专用意味着该服务器已被购买,专门用于运行此应用程序。
我已经尽可能通过广泛的分析、花式数学技巧和位操作技巧来优化代码。
以下是伪代码的总体结构:
该应用程序是.NET 4.0(C#)控制台应用程序,执行一个大约五个小时的复杂算法。该算法不会占用太多内存,只占用处理器资源。它进行数字计算,不执行任何磁盘I/O、数据库连接、网络连接等操作。该应用程序的输出仅是一个数字,它在结束时将其写入控制台。换句话说,该算法是完全独立的,没有任何依赖关系。
该应用程序在其自己的专用16核64位机器上运行,运行Windows Server,比它所需的空闲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的内容都不应该在优先级方面进行更改。所以如果需要切换到手动线程,那就这么做。
问题:
- 如何将上述代码更改为手动线程以从增加的线程优先级中受益(不使用线程池等)?
- 将所有子线程的优先级设置为最高是否有帮助?我的意思是,子线程是否会相互争夺,还是会使它们在外部OS任务中具有优势?
- 考虑到有16个核心,我应该运行16个或15个线程?是否有一般的指导方针?
- 将进程优先级设置为实时是否也有帮助?