我有一个用C#编写的WPF应用程序。它必须实例化数千个对象。从数据库服务器提取数据后,它必须运行大量需要时间的计算。整个过程需要20-30秒,其中80%来自计算。
为了帮助解决这个问题,我编写了一个WCF服务,它保存已经实例化的对象的副本,并且已经运行了计算,然后根据请求将实例化的对象传输到调用客户端。
有效!然而它很慢......真的很慢。比原来的方式慢得多。从WCF服务传输所有对象需要3-4分钟,从而无法实现其目的。
我尝试过流而不是缓冲服务,增加或减少客户端和服务器配置文件中的不同服务选项,但还没有找到真正有效的设置。
预计这种速度是否缓慢,还是应该很快,我只需要修改一些选项?如果是这样,有什么选择?
答案 0 :(得分:1)
WCF不一定很慢,但如果应用程序设计不当,应用程序可能会很慢。它可以比作在跑车上装载几千磅的重量。汽车 是一辆快车,但它并没有真正得到正确使用。
首先,我要说你必须尽量减少在线上发送的数据量(稍后会详细介绍)。一旦接通线路,如果使用TCP或命名管道而不是HTTP,您将获得更好的性能。见Choosing a Transport。 HTTP非常简单,因为大多数网络都配置为轻松过去,但不适用于大型数据集。
如果延迟来自计算,那么WCF服务将完成的唯一事情是将处理从服务器卸载到客户端。最终,如果您计划向服务器发送大量并发请求,这可能是一件好事 - 甚至是必要的 - 但正如您所注意到的那样,这并不一定意味着最终用户的时间更短。你应该关注的是最小化计算时间。
很难给出细节,因为你没有透露很多关于被查询的内容,返回的内容以及计算的结果。但是,通过Visual Studio SQL Server Projects将代码从应用程序服务器卸载到数据库服务器,我获得了大量数据集的令人印象深刻的结果。由于.NET和MSSQL都是在CLR上编写的,因此您可以使用C#或VB或任何其他CLR语言编写本机数据库对象(如user defined functions),并将它们直接部署到数据库中。然后,您可以在查询中使用这些函数,并且它们非常快速,因为它们被编译为本机SQL。我已经看到在应用程序中运行C#与在数据库中运行相同函数之间的差异。
答案 1 :(得分:1)
如果80%的应用工作来自计算,那么将它的某些部分平行化可能是一个好主意,例如使用Task Parallel Library。