C # Как максимизировать вероятность того, что конкретный раздел кода не будет переключаться контекст? - PullRequest
3 голосов
/ 20 июня 2010

У меня есть критический по времени кусок кода в моем приложении.Я создал поток, который запускает его. Наивысший приоритет - это максимум, что я мог сделать.

Есть ли какие-либо предложения о том, как заставить часть кода, выполняемого в этом потоке, прерываться как можно меньше раз (меньше контекстапроизошло переключение)?

Код не сложный.Я заменил все вызовы метода встроенным кодом, и я не использую ничего высокого уровня (например, без LINQ).Большинство операций арифметические.Есть только одно сравнение строк (я думаю о том, как избавиться от него).Половина математики - с целыми, а половина - с двойными.

Код x86 .NET 4 C #.Работает на одном Xenon X3450 W2008R2.Один сервер приложений.

(К сожалению, данные поступают от стороннего API, который не поддерживает x64 (ненавижу!))

Я был бы признателен взрослымобсуждение с опытными разработчиками.

PS На сервере нет файла подкачки, поэтому серьезных сбоев страниц также не произойдет (никаких нежелательных операций ввода-вывода).

Ответы [ 2 ]

2 голосов
/ 20 июня 2010

Единственное, о чем вам нужно беспокоиться с точки зрения переключения контекста, это блокирование вашего потока. Таким образом, не должно быть никаких проблем с использованием LINQ (то есть LINQ-to-objects, очевидно, LINQ-to-SQL или чего-либо, что может включать блокировку!). Любые арифметические или вызывающие методы и т. Д. Также не будут блокировать поток и поэтому не будут влиять на переключение контекста.

Другая вещь, которая влияет на переключение контекста, - это, как вы заметили, приоритет. Но не только приоритет потока, но и приоритет вашего процесса. Вы можете использовать SetPriorityClass , чтобы увеличить приоритет вашего процесса до ABOVE_NORMAL_PRIORITY_CLASS (я бы не стал ставить его выше этого значения), а затем также установить приоритет вашего потока выше Above Normal.

Однако в целом приоритеты действительно полезны только тогда, когда речь идет о синхронизации (то есть, чтобы ваш процесс реагировал на внешний ввод (сеть, ввод пользователя, дисковый ввод / вывод) так быстро насколько это возможно). На самом деле это будет очень мало влиять на фактическую пропускную способность вашего потока, если только у вас не запущены другие процессы, которые также связаны с процессором. Но если это так, то расставание с приоритетами в любом случае не будет жизнеспособным долгосрочным решением. Это потому, что вы обнаружите, что, установив один из процессов с более высоким приоритетом, он полностью истощит другие процессы, и они никогда не запустятся.

Так или иначе, я бы тщательно обдумал все перед тем, как настраивать потоки и приоритеты процесса. И, как всегда, тестируй, тестируй, тестируй!

1 голос
/ 20 июня 2010

Если вместо этого сделать неуправляемый код WINAPI, функция SetThreadPriority также поддерживает THREAD_PRIORITY_TIME_CRITICAL (выше, чем THREAD_PRIORITY_HIGHEST).

Также стоит повысить приоритет процесса, в котором выполняется поток (фактический приоритет зависит от комбинации потока и приоритета процесса).

Вам также следует избегать вызовов ввода / вывода в потоке (которые могут блокироваться). Принимая это, возможно, до смешного крайности, вы также можете избежать вызовов ввода-вывода в других потоках (что может временно повысить приоритет этих потоков).

...