Какова задержка при первом вызове WCF через serviceProxy?

Подобных вопросов много, но все они касаются медлительности на стороне сервера — это все о проблемах на стороне клиента.

1-й вызов занимает 900 мс. Второй вызов занимает 20 мс.

Я сократил медлительность при первом вызове serviceProxy.Method(). Fiddler сообщает, что фактическое время на линии для 1-го вызова составляет 16 мс. Поскольку второй вызов намного быстрее, я вынужден сделать вывод, что проблема возникает с некоторым кодом создания экземпляра на стороне клиента WCF, который срабатывает при вызове первого метода.

Факты:

  • Подключение к серверу происходит через wsHttpBinding
  • Объекты закодированы с помощью библиотеки Protobufs.NET Марка Гравелла.
  • Вопросы здесь, на SO, которые действительно решают проблемы на стороне клиента, такие как мои, рекомендуют сделать 1-й вызов в фоновом потоке, чтобы просто избавиться от медлительности. Однако это устранение симптомов, а не основной причины.

Есть идеи, почему замедление происходит на 1-м посте?


person AngryHacker    schedule 30.09.2011    source источник
comment
Это обычная тема в Интернете. В основном это связано с накладными расходами на загрузку и инициализацию среды WCF в первый раз.   -  person Cᴏʀʏ    schedule 30.09.2011
comment
Дубликат: stackoverflow.com/ вопросы/3350960/, stackoverflow .com/questions/4289357/   -  person Cᴏʀʏ    schedule 30.09.2011
comment
Не совсем уверен... В этих статьях говорится о времени раскрутки пула приложений IIS. В своем вопросе он заявил, что, несмотря на то, что запрос занял много времени, время прохождения сервера в Fiddler показало 16 мс, что исключает раскрутку IIS - если это правда, пришло время на клиенте.   -  person bryanmac    schedule 30.09.2011
comment
@bryanmac Вы правы. IIS уже запущен и прогрет. Определенно не IIS. Я вижу небольшую паузу в Fiddler еще до того, как вызов появится. Второй звонок появляется сразу.   -  person AngryHacker    schedule 30.09.2011
comment
какую версию protobuf-net вы используете?   -  person Marc Gravell    schedule 30.09.2011
comment
@MarcGravell При первом вызове библиотека protobufs запускается примерно за 0,2 секунды (если я читаю этот вывод профилировщика правильно).   -  person AngryHacker    schedule 01.10.2011
comment
Если вам нужен максимально быстрый запуск, v2 поддерживает предварительное создание сборки сериализации; это, возможно, сократит некоторое время - немного не время WCF   -  person Marc Gravell    schedule 01.10.2011
comment
@AngryHacker да, но обратите внимание, что вы можете использовать это как инструмент сборки для создания отдельной сборки, которую вы используете для сериализации. Однако в большинстве случаев это излишне; мы не используем это для StackOverflow, и мы помешаны на производительности.   -  person Marc Gravell    schedule 01.10.2011
comment
Вы когда-нибудь решали это?   -  person bryanmac    schedule 20.11.2011
comment
@bryanmac Не совсем так, но я решил эту проблему. Я откладываю первый звонок настолько далеко, насколько могу. Тем временем при запуске приложения я делаю фиктивный вызов (который ничего не возвращает) через WCF в отдельном потоке. Таким образом, к тому времени, когда мне нужно будет сделать фактический вызов, WCF загрузится. Я поигрался с предварительным созданием сборок сериализации protobuf, но оно того не стоило, так как библиотека уже довольно быстра. tl;dr решил проблему.   -  person AngryHacker    schedule 20.11.2011


Ответы (1)


Обычная медлительность сервера при запуске - это раскрутка пула приложений IIS, но в своем вопросе вы заявили, что, хотя первый запрос составлял 900 мс, в соответствии с fiddler на запрос сервера было потрачено всего 16 мс. Если это правда, это предполагает, что что-то происходит на стороне клиента.

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

http://msdn.microsoft.com/en-us/library/aa751883.aspx

http://msdn.microsoft.com/en-us/library/ms733901.aspx

Я не знаком с protobuffs, но компиляция кода сериализации - это компромисс, который делает первый вызов значительно медленнее, но делает последующие вызовы быстрее.

Не уверен, что это ваша первоначальная стоимость, но это возможно.

person bryanmac    schedule 30.09.2011
comment
Идея предварительного создания библиотек сериализации дает огромный прирост производительности при использовании простой XmlSerialization, поскольку она изначально очень медленная и сильно загружает ЦП. Не так много с protobufs. - person AngryHacker; 20.11.2011