2010-01-04 2 views
6

Именованные трубы? XML-RPC? Стандартный вход-выход? Веб-сервисы?Какой самый быстрый метод IPC для .NET-программы?

Я бы не использовать небезопасные вещи, как разделяемой памяти и аналогичные

+0

Windows или Linux? –

+3

Как далеко вы продвигаетесь? Это между процессами, запущенными на одном компьютере или между разными компьютерами в одном кластере или между разными компьютерами в одной локальной сети или между разными компьютерами в разных сетях или между любыми двумя произвольными компьютерами в Интернете? –

+1

Какие данные вы обмениваетесь между процессами? – Michael

ответ

9

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

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

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

+4

Именованные каналы * могут быть * и * использованы для связи с удаленными процессами. Это * анонимные трубы *, которые могут использоваться только для локальных процессов. – Aaronaught

+0

Вы в этом уверены? В .NET remoting я всегда придерживался мнения, что он может использоваться только между локальными процессами ... –

+3

Да, именованные каналы должны использоваться для связи клиент/сервер, подобно сокетам, но в отличие от сокетов, некоторые из которых работают с клиентом системы не могут быть «серверами». –

5

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

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

Локальная машина IPC

Network IPC/Internet Sockets

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

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

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

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

+0

-1: Он _did_ сказал C# –

+2

Да, но он также сказал mono, и нет ничего, что помешало бы вам использовать любой из этих методов на C# или на любом другом языке. C# - это язык. а не ОС. Немного несправедливо отмечаю мой ответ, я думаю ... – billywhizz

3

Windows Messaging - один из самых быстрых способов для IPC, на них встроены все окна Windows.

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

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

0

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

Смежные вопросы