Какой метод IPC самый быстрый для программы .NET? - PullRequest
7 голосов
/ 05 января 2010

именованных каналов? XML-RPC? Стандартный ввод-вывод? Веб-сервисы?

Я бы не стал использовать небезопасные вещи, такие как Shared Memory и подобные

Ответы [ 4 ]

9 голосов
/ 05 января 2010

Именованные каналы были бы самым быстрым методом, но он работает только для связи между процессами на одном компьютере. Связь по именованным каналам не проходит весь путь вниз по сетевому стеку (поскольку она работает только для связи на одном и том же компьютере), поэтому она всегда будет быстрее.

Я пропустил Shared Memory, поскольку вы специально упомянули, что не хотите идти по этому пути. Общая память будет даже быстрее, чем именованные каналы.

Таким образом, все зависит от того, требуется ли вам обмен данными между процессами на одном и том же компьютере или разных компьютерах. Любой протокол связи на основе XML (например, веб-службы) обычно будет работать медленнее из-за огромных издержек в XML.

6 голосов
/ 23 марта 2010

Я не думаю, что есть быстрый ответ на это. на вашем месте я бы купил / одолжил копию Advanced Programming в среде Unix (APUE) Стивенса и Раго и прочитал Главы 15 и 16 по IPC. Это блестящая книга, если вы действительно хотите понять, как * nix (большая часть применима к любой системе POSIX) работает до уровня ядра.

Если вам нужен быстрый ответ, я бы сказал следующее (не вкладывая в это огромное количество мыслей) в порядке убывания эффективности:

Локальный компьютер IPC

Сетевые сокеты IPC / Интернет

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

На сетевом уровне вам нужно будет подумать, над какими слоями протоколов вы собираетесь работать. Чаще всего в нижней части прикладного уровня вы будете выбирать между TCP / IP или UDP. TCP имеет гораздо больше накладных расходов, так как он выполняет исправление ошибок, контрольные суммы и много других вещей. если вам нужна доставка сообщений, вам нужно использовать TCP, а не UDP.

Помимо этих других протоколов, таких как HTTP, SOAP (поверх HTTP или другого протокола, такого как FTP / SMTP и т. Д.). Бинарный протокол будет более эффективным, если вы связаны с сетью, а не с процессором. При использовании SOAP на платформе MS.Net бинарное кодирование сообщений будет быстрее по всей сети, но может потребовать больше ресурсов процессора.

Я мог бы продолжить. это не простой вопрос. Знание того, где находятся задержки и как обрабатывается буферизация, является ключом к возможности принимать решения о компромиссах, которые вы всегда вынуждены делать с IPC. Я бы порекомендовал книгу APUE выше, если вы действительно хотите знать, что происходит под капотом ...

2 голосов
/ 25 марта 2010

Обмен сообщениями в Windows - один из самых быстрых способов IPC, ведь Windows построена на них.

Можно использовать WM_COPYDATA с вызовами IPInvoke для обмена данными между двумя приложениями .Net на основе форм, и у меня есть библиотека с открытым исходным кодом для именно этого. На довольно горячем ноутбуке я набрал около 1771 мс / сек.

http://thecodeking.github.com/XDMessaging.Net

0 голосов
/ 27 декабря 2016

Я не знаю, почему вы не будете использовать общую память, но очень очень быстро из приложений C # в C # на одной машине и очень надежно (в отличие от сокетов TCP). spazzarama / SharedMemory - это фантастическая библиотека C #, которая поддерживает общие массивы и буферы с помощью простого API высокого уровня. Вы просто инициализируете класс с общим именем файла памяти (на стороне клиента / сервера), а затем обновляете массив. Значения волшебным образом появляются на другой стороне!

...