我的应用程序中有一段时间关键的代码。我做了线程,运行它的最高优先级-这是我所能做的最多。
对于如何使代码的一部分在这个线程中被尽可能少的中断(发生更少的上下文切换)有任何建议吗?
代码并不复杂。我用内联代码替换了所有的方法调用,并且我不使用任何高级别的(比如没有LINQ)。大多数运算都是算术运算。只有一个字符串的比较(我正在考虑如何摆脱它)。一半的数学有高考,一半的有双打。
代码是x86 .NET 4 C#。运行在单个Xenon X3450 W2008R2上。单应用服务器。
(不幸的是,数据来自3d派对API,它不支持x64 (讨厌它!)
我希望与有经验的开发人员进行成熟的讨论。
服务器没有分页文件,所以硬页错误也不会发生(没有不必要的IO操作)。
发布于 2010-06-19 22:56:32
在上下文切换方面,唯一需要担心的是阻塞线程。因此,使用LINQ (也就是说,,显然是LINQ或任何涉及阻塞的东西)应该没有问题。任何类型的算术或调用方法等等也不会阻塞线程,因此不会影响上下文切换。
正如您所提到的,影响上下文切换的另一件事是优先级。但不仅仅是线程优先级,还有进程的优先级。您可以使用SetPriorityClass将进程的优先级提高到ABOVE_NORMAL_PRIORITY_CLASS (我不想把它放在更高的位置),然后将线程的优先级设置为高于正常的优先级。
但是,通常情况下,优先级只有在时间问题(即确保您的流程尽可能快地响应外部输入(网络、用户输入、磁盘I/O)时才有用)。它实际上对线程的实际吞吐量影响很小,除非您有其他同时运行CPU绑定的进程。但如果是这样的话,那么摆弄优先次序无论如何也不是一个可行的长期解决方案。这是因为您会发现,通过将其中一个进程设置为更高的优先级,它将完全饿死其他进程,它们将永远无法运行。
因此,无论如何,在调整线程和进程优先级之前,我会仔细考虑一些事情。和往常一样,测试!
发布于 2010-06-19 22:42:11
如果使用非托管WINAPI代码,则SetThreadPriority函数还支持THREAD_PRIORITY_TIME_CRITICAL (高于THREAD_PRIORITY_HIGHEST)。
提高线程运行过程的优先级也是值得的(实际优先级取决于线程和进程优先级的组合)。
您还应该避免对线程(可能会阻塞)进行I/O调用。把它带到一个可能很荒谬的极端,您也可以避免对其他线程进行I/O调用(这可能暂时提高这些线程的优先级)。
https://stackoverflow.com/questions/3077501
复制相似问题