2010-12-10 3 views
4

Я работаю над проектом, в котором клиент Silverlight 4 вызывает веб-сервис WCF, который возвращает большой объем данных. Некоторые профилирование показало, чтоСамая быстрая привязка WCF для Silverlight 4

  • Фактическое выполнение метода WebService занимает менее одной секунды (вызывает другой сервер/генерирует очень большой набор данных/и т.д.., Это уже довольно оптимизированная там)

  • передачи данных зависит в сети, но, как правило, не проблема - он может взять все, что ему нужно

  • Время между клиентом получает HTTP-ответ (я вижу его завершенным в Fiddler) и событие Completed, запущенное в клиенте Silverlight: ~ 15 секунд (никакой разницы между IE/Firefox/хром)

Я полагаю, что задержка 15 секунд, в значительной степени, проведенное в десериализации.

Мое связывание использует HttpTransport и BinaryMessageEncoding, с компрессией gzip сверху. Сжатие Gzip, похоже, не влияет на производительность: разница между отсутствием сжатия и максимальным уровнем сжатия практически не существует. Ответ на http составляет ~ 15 Мб без сжатия и ~ 400 кб сжимается (много накладных расходов даже с бинарным XML!)

Примечание: веб-сервис является полностью ad hoc, меня не интересует интероперабельность и полная свобода в выборе протокола.

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

Я остался с привязкой wcf: этот проект начался с SL 2 и развился через SL 3 и SL 4, так что, возможно, мне не хватает какого-то более быстрого связывания, введенного в Silverlight 4. Есть ли еще более быстрый кодер (или связывание), я могу использовать, чтобы избежать узкого места десериализации на клиенте?

ответ

2

Как насчет «обмана» (улучшается только полученная производительность)?

Возвратите небольшое подмножество данных при первом вызове, затем разверните фоновый процесс, чтобы извлечь все, что вам нужно. Если данные, которые вы показываете, только для чтения, то это может помочь.

Редактировать: Посмотрите на привязку приоритета ... Он позволяет связывать несколько источников данных с сеткой. Если медленное соединение вернется позже, silverlight автоматически свяжет новый источник данных ...

+0

Это хороший совет, спасибо. Я определенно реализую нечто подобное, если я не смогу улучшить реальную производительность. – 2010-12-10 08:38:19

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