3

我的应用程序中有一段对时间要求严格的代码。我将运行它的线程设为最高优先级——这是我能做的最多的事情。

关于如何使该线程中运行的部分代码尽可能少地被中断(发生较少的上下文切换)有什么建议吗?

代码并不复杂。我用内联代码替换了所有方法调用,并且没有使用任何高级别的东西(比如没有 LINQ)。大多数运算是算术运算。字符串只有一个比较(我正在考虑如何摆脱它)。一半的数学是整数,一半是双精度数。

代码是 x86 .NET 4 C#。在单个 Xenon X3450 W2008R2 上运行。单一应用服务器。

(不幸的是,数据来自不支持 x64 的 3d 派对 API(讨厌它!))

我很感激与经验丰富的开发人员进行成人讨论。

PS 服务器没有分页文件,因此也不会发生硬页面错误(没有不需要的 IO 操作)。

4

2 回答 2

2

在上下文切换方面,您唯一需要担心的是阻塞线程。所以使用 LINQ 应该没有问题(也就是说,LINQ-to-objects,显然是 LINQ-to-SQL 或任何涉及阻塞的东西!)。任何类型的算术或调用方法等也不会阻塞线程,因此对上下文切换没有影响。

正如您所指出的,影响上下文切换的另一件事是优先级。但不仅仅是线程优先级,还有你的进程的优先级。您可以使用SetPriorityClass将进程的优先级提高到ABOVE_NORMAL_PRIORITY_CLASS(我不会费心把它设置得更高),然后也将线程的优先级设置为高于正常值。

然而,一般来说,优先级仅在时间问题(即确保您的进程尽可能快地响应外部输入(网络、用户输入、磁盘 I/O))时才真正有用。它实际上对线程的实际吞吐量几乎没有影响,除非您同时运行其他同样受 CPU 限制的进程。但如果是这样的话,那么摆弄优先级无论如何都不是一个可行的长期解决方案。这是因为您会发现通过将其中一个进程设置为更高的优先级,它会完全饿死其他进程并且它们永远不会运行。

所以无论如何,我会在调整线程和进程优先级之前仔细考虑。而且,一如既往,测试,测试,测试!

于 2010-06-19T22:56:32.667 回答
1

如果您改为使用非托管 WINAPI 代码,则 SetThreadPriority 函数还支持 THREAD_PRIORITY_TIME_CRITICAL(高于 THREAD_PRIORITY_HIGHEST)。

提高线程运行的进程的优先级也是值得的(实际优先级取决于线程和进程优先级的组合)。

您还应该避免在线程上进行 I/O 调用(这可能会阻塞)。把它带到一个可能很荒谬的极端,您还可以避免在其他线程上进行 I/O 调用(这可能会暂时提高这些线程的优先级)。

于 2010-06-19T22:42:11.450 回答