Высочайшая производительность для Cross AppDomain Signaling - PullRequest
7 голосов
/ 29 марта 2011

Мое чувствительное к производительности приложение использует MemoryMappedFiles для передачи больших объемов данных между многими доменами приложений. Мне нужен самый быстрый механизм для оповещения принимающей AD о том, что есть новые данные для чтения.

Дизайн выглядит так:

AD 1: Запись в MMF, когда данные записываются, они должны уведомлять читателя AD

AD 2,3, N ..: Считыватель MMF

Читателям не нужно знать, сколько данных записано, потому что каждое написанное сообщение будет начинаться с ненулевого int и будет читать до нуля, не беспокойтесь о частично написанных сообщениях.

(я думаю) Традиционно, внутри одной AD, Monitor.Wait / Pulse может быть использован для этого, я не думаю, что он работает во всех доменах приложений.

Можно также использовать метод или событие удаленного взаимодействия MarshalByRefObject, но я бы хотел что-то быстрее. (Я тестирую 1 000 000 вызовов MarshalByRefObject / сек на моей машине, неплохо, но я хочу больше)

Имя EventWaitHandle примерно в два раза быстрее по сравнению с первоначальными измерениями.

Есть ли что-нибудь быстрее?

Примечание. Принимающим AD не нужно получать каждый сигнал, пока последний сигнал не сброшен.

Ответы [ 2 ]

2 голосов
/ 29 марта 2011

Переключение контекста потока стоит от 2000 до 10000 машинных циклов в Windows.Если вы хотите больше миллиона в секунду, вам придется решить проблему узкого места с большой скоростью.Вы уже находитесь на очень низком уровне издержек.

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

0 голосов
/ 12 октября 2011

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

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

Я надеюсь, что Microsoft продолжает улучшать функциональность кросс-доменных приложений, поскольку это может реально помочь с надежностью приложений и надстройками.

...