Служба WCF медленно передает объекты.Это нормально? - PullRequest
3 голосов
/ 23 февраля 2012

У меня есть приложение WPF, написанное на C #. Он должен создавать экземпляры тысяч объектов. Получив данные с сервера базы данных, он должен выполнить кучу вычислений, которые требуют времени. Весь процесс занимает до 20-30 секунд, причем 80% его приходится на расчеты.

Поэтому, чтобы помочь решить эту проблему, я написал службу WCF, которая хранит копию уже созданных экземпляров объектов с уже запущенными вызовами, а затем по запросу передает экземпляры объектов вызывающему клиенту.

Это работает! Однако это медленно ... очень медленно. Гораздо медленнее, чем оригинальный способ. Передача всех объектов из службы WCF занимает 3-4 минуты, что отрицательно сказывается на его назначении.

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

Стоит ли ожидать медленной скорости или она должна быть быстрой, и мне просто нужно изменить некоторые параметры? Если да, то какие варианты?

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Если 80% работы вашего приложения исходит из расчетов, то было бы неплохо парализовать некоторые его части, например, с помощью Task Parallel Library .

1 голос
/ 23 февраля 2012

WCF не обязательно медленный, но если приложение не разработано должным образом, приложение может быть медленным. Это можно сравнить с нагрузкой в ​​несколько тысяч фунтов на спортивный автомобиль. Машина - это быстрая машина, но на самом деле она не используется должным образом.

Во-первых, я бы сказал, что вы должны минимизировать объем данных, отправляемых по проводам (подробнее об этом позже). Когда вы подключитесь к сети, вы получите намного лучшую производительность, если будете использовать TCP или именованные каналы вместо HTTP. См. Выбор транспорта . HTTP прост, так как большинство сетей настроено так, что он легко проходит, но он не предназначен для больших наборов данных.

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

Трудно дать конкретику, так как вы мало что рассказали о том, что запрашивается, что возвращается и что делают вычисления. Тем не менее, я получил впечатляющие результаты с большими наборами данных, выгружая код с сервера приложений на сервер базы данных через Visual Studio SQL Server Projects . Поскольку .NET и MSSQL оба написаны на CLR, вы можете написать собственные объекты базы данных (например, пользовательские функции ) в C # или VB или любом другом языке CLR и развернуть их непосредственно в базе данных. Затем вы можете использовать эти функции в своих запросах, и они будут очень быстрыми, поскольку они скомпилированы в собственный SQL. Я видел разницу в размерах между запуском C # в приложении и запуском той же функции в базе данных.

...