首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#如何最大限度地利用特定部分代码没有上下文切换的机会?

C#如何最大限度地利用特定部分代码没有上下文切换的机会?
EN

Stack Overflow用户
提问于 2010-06-19 22:34:02
回答 2查看 656关注 0票数 3

我的应用程序中有一段时间关键的代码。我做了线程,运行它的最高优先级-这是我所能做的最多。

对于如何使代码的一部分在这个线程中被尽可能少的中断(发生更少的上下文切换)有任何建议吗?

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

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

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

我希望与有经验的开发人员进行成熟的讨论。

服务器没有分页文件,所以硬页错误也不会发生(没有不必要的IO操作)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-19 22:56:32

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

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

但是,通常情况下,优先级只有在时间问题(即确保您的流程尽可能快地响应外部输入(网络、用户输入、磁盘I/O)时才有用)。它实际上对线程的实际吞吐量影响很小,除非您有其他同时运行CPU绑定的进程。但如果是这样的话,那么摆弄优先次序无论如何也不是一个可行的长期解决方案。这是因为您会发现,通过将其中一个进程设置为更高的优先级,它将完全饿死其他进程,它们将永远无法运行。

因此,无论如何,在调整线程和进程优先级之前,我会仔细考虑一些事情。和往常一样,测试!

票数 2
EN

Stack Overflow用户

发布于 2010-06-19 22:42:11

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3077501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档