.NET: накладные расходы на многопоточность - PullRequest
2 голосов
/ 10 октября 2011

Предположим, у меня есть два потока: A и B. Когда A создает объект (например, список строк) и передает его B для обработки.Будет ли снижение производительности при каждом доступе B к этому объекту?Или будет одноразовый штраф, пока объект маршалируется от А до Б?

Ответы [ 3 ]

6 голосов
/ 10 октября 2011

В .NET нет сортировки между потоками.Оба потока будут взаимодействовать с одной и той же памятью для хранения, связанного с объектом.Нет никаких накладных расходов, связанных с выполнением операции над объектом одним потоком, а не другим.

Вам нужно беспокоиться о синхронизации между потоками, чтобы обеспечить безопасность потоков, а не производительность.

3 голосов
/ 10 октября 2011

Потоки располагаются в одном и том же пространстве памяти, поэтому нет маршалинга и штрафов за доступ к объектам.

Однако, поскольку они совместно используют память, вы должны синхронизировать доступ к объектам, чтобы все, что когда-либо изменялось, было доступно только одному потоку за раз. Когда один поток обращается к объекту, другой поток должен ждать, так что это вызовет некоторые накладные расходы.

2 голосов
/ 10 октября 2011

То, что вы используете несколько потоков в .Net, не означает, что будет использоваться маршалинг.Marshaling вступает в игру, когда вы обмениваетесь объектами между доменами приложений.

Если предположить, что доменов приложений нет, то накладные расходы, которые вы бы заплатили, будут блокироваться - убедитесь, что только один поток одновременно обращается к объекту.Каждый раз, когда вы блокируете и разблокируете объект, он будет занимать несколько циклов ЦП.

Использование нескольких потоков может также добавить другие штрафы - например, если вам нужно переключиться с потока A на поток B, чтобы выполнить какую-то задачу, тогдаможет быть наказание за переключение потоков.Если ЦП должен уложить поток A в постель и активировать поток B, то на это потребуется несколько циклов процессора.Даже если поток A и поток B работают на разных ЦП, но изменяют общие данные, данные в кэшах ЦП, возможно, придется отбросить (сбой кэша).Просто предупреждение, что вы можете попытаться ускорить что-то, обрабатывая параллельно, но в конечном итоге замедляете работу вашего приложения.

Маршалинг будет использоваться, если вы обращаетесь к объекту, созданному в одном .Net AppDomain из другого.И, в зависимости от типа используемого вами маршалинга, вы можете выбрать одноразовый штраф (маршал по значению) или штраф за вызов (маршал по ссылке).

...