我知道设置线程优先级是堆栈溢出的一个禁忌话题,但我相信我的应用程序是提高优先级的良好候选者。为了证明这一点,我在下面解释了上下文。现在的问题是如何有效地做到这一点?
该应用程序是执行复杂算法的 .NET 4 (C#) 控制台应用程序,执行时间约为 5 小时。该算法根本不是内存密集型的,只是处理器密集型的。它进行数字运算,不执行任何磁盘 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 的东西都不应该在优先级方面被搞乱。所以如果我需要切换到手动线程,就这样吧。
问题:
- 我应该如何将上述代码更改为手动线程以受益于增加的线程优先级(不使用线程池等)?
- 将所有子线程的优先级设置为最高会有所帮助吗?我的意思是子线程会只是相互争斗,还是会让它们在外部操作系统任务中占据优势?
- 考虑到有 16 个内核,我应该运行 16 个还是 15 个线程?对此有一般指导方针吗?
- 将进程优先级设置为实时是否也有帮助?