WCF с плохой производительностью netNamedPipeBinding - PullRequest
4 голосов
/ 26 января 2012

Я использую сервис WCF с netNamedPipeBinding для передачи большого количества данных (очень длинный список объектов) клиенту (который, конечно, находится на той же машине).Проблема в том, что на передачу всего вызова требуется около 20 секунд, что составляет около 250 МБ данных, что составляет около 10 МБ в секунду.Я ожидал, что при совместном использовании памяти скорость передачи данных будет намного выше.Кто-нибудь знает, как я могу улучшить свою производительность и скорость передачи?Вот мой файл app.config:

      <netNamedPipeBinding>
    <binding name="NetNamedPipeBinding_IDataService" closeTimeout="00:10:00"
      openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
      transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
      hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647"
      maxBufferSize="2147483647" maxConnections="10" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"
        maxBytesPerRead="4096" maxNameTableCharCount="2147483647" />
      <security mode="Transport">
        <transport protectionLevel="None" />
      </security>
    </binding>
  </netNamedPipeBinding>

Большое спасибо!

1 Ответ

1 голос
/ 17 марта 2012

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

Есть три момента, которые следует учитывать:

  • ЦПиспользование сериализации и десериализации
  • хранение объектов в памяти
  • скорость передачи

Для отправки через 250 МБ сначала будет сериализовано, а затем отправленозакончен, затем десериализован.Это может привести к 3 копиям данных в памяти, что может привести к перегрузке диска.

У нас была похожая проблема несколько лет назад, и мы в итоге переключились на прямой вызов DLL, передавая ссылку на памятьсписок занял бы ок.1 миллисек.

...